notebook-intelligence 6.0.0a3__tar.gz → 6.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/PKG-INFO +2 -2
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/admin-guide.md +2 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/admin-tour-config.md +14 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/chatbook-extensions.md +4 -1
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/chatbook.md +16 -3
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/_version.py +1 -1
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_mentions.py +111 -45
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/extension.py +32 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/package.json +2 -2
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/package.json.orig +1 -1
- notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/7.b660d984046388f395e5.js +1 -0
- notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/728.5359de99fbe302f4380b.js +1 -0
- notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/editor.worker.js +1407 -0
- notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/remoteEntry.10c9ca7e4b3cffb98413.js +1 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/package.json +1 -1
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/pyproject.toml +12 -5
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook.py +272 -2
- notebook_intelligence-6.2.0/tests/test_tour_disabled.py +119 -0
- notebook_intelligence-6.2.0/tests/ts/chat-prefix-suggestions.test.ts +140 -0
- notebook_intelligence-6.2.0/tests/ts/chatbook-convert.test.ts +106 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chatbook-mentions-menu.test.ts +41 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chatbook-mentions.test.ts +32 -0
- notebook_intelligence-6.2.0/tests/ts/chatbook-summarize.test.ts +95 -0
- notebook_intelligence-6.2.0/tests/ts/chatbook-toolbar-convert.test.ts +241 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chatbook.test.ts +530 -0
- notebook_intelligence-6.2.0/tests/ts/select-theme-css.test.ts +66 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tour-state.test.ts +23 -1
- notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/701.98cf201a781644814727.js +0 -1
- notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/728.7f069be896fa3f595701.js +0 -1
- notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/editor.worker.js +0 -1407
- notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/remoteEntry.342cef7bc2948099c0d0.js +0 -1
- notebook_intelligence-6.0.0a3/tests/ts/chat-prefix-suggestions.test.ts +0 -55
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.copier-answers.yml +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.editorconfig +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.gitignore +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/.gitignore +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/applypatch-msg +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/commit-msg +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/h +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/husky.sh +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-applypatch +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-checkout +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-commit +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-merge +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-rewrite +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-applypatch +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-auto-gc +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-commit +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-merge-commit +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-push +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-rebase +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/prepare-commit-msg +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/pre-commit +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.prettierignore +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.vscode/extensions.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.vscode/settings.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.yarnrc.yml +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/AGENTS.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/CHANGELOG.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/CLAUDE.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/CONTRIBUTING.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/LICENSE +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/PRIVACY.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/README.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/RELEASE.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/SECURITY.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/README.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/bench_runner.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/bench_terminal.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/prompts.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/report.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/stats.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/acp.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/performance-diagnostics.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/rulesets.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/skills.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/troubleshooting.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/install.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/jest.config.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/jupyter-config/server-config/notebook_intelligence.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/__init__.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/_claude_cli.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/acp_agent.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/acp_mcp_server.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/acp_registry.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/ai_service_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/api.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/base_chat_participant.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/built_in_toolsets.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/cell_output.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chat_history_budget.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_generate.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/__init__.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/__main__.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/backend.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/codegen.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/danger.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/execution.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/kernel.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/kernelspec/kernel.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/kernelspec/logo-svg.svg +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/nbi_client.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/checks.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/claude.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/claude_mcp_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/claude_sessions.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/config.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/context_factory.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/feature_flags.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/github_copilot.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/inline_completion.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/156.7e517ead254858a9eb50.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/196.ae4c84cd4812d9d7cbcf.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/24c0eed6cf7014abfb18.module.wasm +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/537.e250b395dd56252f433b.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/631.c3b7a19d8e9bb293fff8.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/671.dd4f3f162a9464547691.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/694.97c3499ce07ad99e125a.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/768.7edd3110b64beb9041b7.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/938a2c885cbaa713e543.module.wasm +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/976.7dffd54c5614c4e8083f.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/style.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/third-party-licenses.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_client.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_config_validation.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_policy.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_ui_proxy.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/perf.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/perf_probe.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/plugin_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/prompts.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/readiness.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/rule_injector.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/rule_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/ruleset.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_github_import.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_manifest.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_reconciler.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skillset.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/tour_config.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/util.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/schema/plugin.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/setup.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/conftest.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/01-test-global.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/02-test-security.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/03-invalid-rule.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_acp_agent.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_ai_service_manager_dispatch.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_ai_service_manager_integration.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_api_hygiene.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_base_chat_participant_integration.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_builtin_cell_output.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_builtin_file_read.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_builtin_search_files_sandbox.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_cell_output.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_cell_output_features_response.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chat_history_budget.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook_backend.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook_danger.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook_enable.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook_perf.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_bash_approval_rendering.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_client.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_mcp_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_models.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_sdk_mcp_server.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_sessions.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_sessions_handler.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_system_prompt.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_tool_humanizer.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_tool_path_sandbox.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_tool_results.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_turn_usage.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_coding_agent_launchers.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_config_atomic_save.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_config_handler_claude_settings.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_config_integration.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_context_factory.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_default_password_refusal.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_disabled_provider_models.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_enabled_providers_env.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_end_to_end_rule_integration.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_feature_flags.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_feedback.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_file_upload.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_github_copilot_login_gating.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_github_copilot_user_data_mode.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_image_context.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_inline_completion_shortcuts.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_lazy_provider_imports.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_client_shim.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_config_validation.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_manager_command_allowlist.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_null_config.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_policy.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_models.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_perf.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_perf_instrumentation.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_perf_probe.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_permission_modes.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_plugin_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_policy_gate.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_process_tree_teardown.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_provider_stream_cancellation.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_readiness.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_redact_process_secrets.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_response_emitter.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_rule_auto_reload.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_rule_injector.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_rule_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_run_ui_command_allowlist_parity.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_safe_anchor_uri.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_fetch_redirects.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_github_import.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_manager.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_manifest.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_reconciler.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skills_handlers.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_tour_config.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_user_input_wait.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_websocket_handler_integration.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_ws_callback_handler_leak.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_ws_handler_auth.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/jupyterlab-apputils.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/strip-ansi.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/svg.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/tiktoken.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/ask-user-question.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/cell-output-bundle.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/cell-output-features.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/cell-output-toolbar.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chat-cancel.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chat-progress-feedback.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chat-stopped-turn.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chat-transcript.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chatbook-execute.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/checkbox.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/choose-workspace-directory.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/claude-mcp-paste.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/coding-agent-launchers.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/confirmation-details.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/inline-completer-telemetry.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/inline-completion-origin.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/inline-completion-request.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/launcher-picker.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/markdown-code-class.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/markdown-renderer.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/mcp-config-save.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/mcp-config-temp-file.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/mcp-util.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/notebook-generation.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/open-file-refresh-watcher.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/perf-panel.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/permission-mode-select.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/plugins-panel.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/readiness-card.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/response-stream-command-allowlist.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/safe-anchor.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/settings-property-field.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/settings-required-property.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/settings-tab-name.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/setup.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/skill-wire-format.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/task-target-notebook.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/terminal-drag.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tool-call-card.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tool-call-group.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tool-call-stream.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tour-config.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tour-events.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tour-overlay.test.tsx +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tsconfig.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/utils.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/workspace-skips.test.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tsconfig.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/.eslintrc.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/README.md +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/jupyter_server_test_config.py +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/package.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/playwright.config.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/cell-output.spec.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/chatbook-cell-mode-badge.spec.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/extension.spec.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/helpers.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/launcher.spec.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tsconfig.json +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/yarn.lock +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/webpack.config.js +0 -0
- {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/yarn.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: notebook_intelligence
|
|
3
|
-
Version: 6.0
|
|
3
|
+
Version: 6.2.0
|
|
4
4
|
Summary: AI coding assistant for JupyterLab
|
|
5
5
|
Project-URL: Homepage, https://github.com/plmbr/notebook-intelligence
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/plmbr/notebook-intelligence/issues
|
|
@@ -694,7 +694,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
694
694
|
Classifier: Programming Language :: Python :: 3.11
|
|
695
695
|
Classifier: Programming Language :: Python :: 3.12
|
|
696
696
|
Requires-Python: >=3.10
|
|
697
|
-
Requires-Dist: agent-client-protocol
|
|
697
|
+
Requires-Dist: agent-client-protocol<1,>=0.11.0
|
|
698
698
|
Requires-Dist: aiohttp>=3.14.3
|
|
699
699
|
Requires-Dist: anthropic>=0.22.1
|
|
700
700
|
Requires-Dist: claude-agent-sdk
|
|
@@ -113,6 +113,8 @@ The full surface, in one table.
|
|
|
113
113
|
| `NBI_MCP_STDIO_COMMAND_ALLOWLIST` | csv | unset | env (appends to traitlet) | Comma-separated regex patterns added to the traitlet at startup. Per-pod additions on an org baseline. |
|
|
114
114
|
| `tour_config_path` | str | `""` | traitlet | Filesystem path to a YAML/JSON file with admin overrides for the first-run sidebar tour copy. See [`docs/admin-tour-config.md`](admin-tour-config.md). |
|
|
115
115
|
| `NBI_TOUR_CONFIG_PATH` | str | unset | env (overrides traitlet) | Same as above; env takes precedence. |
|
|
116
|
+
| `tour_disabled` | bool | `False` | traitlet | Suppress the first-run tour. The "Show NBI tour" command still replays it. See [`docs/admin-tour-config.md`](admin-tour-config.md). |
|
|
117
|
+
| `NBI_TOUR_DISABLED` | bool | unset | env (overrides traitlet) | Same as above; env takes precedence. |
|
|
116
118
|
| `NBI_GH_ACCESS_TOKEN_PASSWORD` | str | `nbi-access-token-password` | env | Password used to encrypt the stored Copilot token in `user-data.json`. **Change in multi-tenant deployments.** |
|
|
117
119
|
| `NBI_REFUSE_DEFAULT_TOKEN_PASSWORD_ON_SHARED_FS` | bool | unset | env | When set, refuse to write `user-data.json` if the default `NBI_GH_ACCESS_TOKEN_PASSWORD` is still in use AND `~/.jupyter/nbi/` is readable by group or other. Opt-in to preserve backwards compatibility on single-user deployments where the directory mode is incidental. |
|
|
118
120
|
| `NBI_ALLOW_DEFAULT_TOKEN_PASSWORD` | bool | unset | env | Per-pod opt-out that disengages the refuse-on-shared-fs guard above. Admins who knowingly accept the risk (e.g., during a transition before rolling out a per-user password) set this so writes continue. |
|
|
@@ -6,6 +6,20 @@ Point the `NBI_TOUR_CONFIG_PATH` environment variable (or the
|
|
|
6
6
|
`NotebookIntelligence.tour_config_path` traitlet) at a YAML or JSON file
|
|
7
7
|
and Notebook Intelligence will overlay your copy on the built-in steps.
|
|
8
8
|
|
|
9
|
+
## Turning the tour off
|
|
10
|
+
|
|
11
|
+
Set `NBI_TOUR_DISABLED=1` (or `NotebookIntelligence.tour_disabled = True`)
|
|
12
|
+
to stop the tour from opening on first run. The environment variable
|
|
13
|
+
takes precedence over the traitlet. Users can still replay the tour from
|
|
14
|
+
the command palette ("Show NBI tour"). Unlike disabling every step in an
|
|
15
|
+
override file, this switch does not need updating when steps are added.
|
|
16
|
+
|
|
17
|
+
The switch only stops the tour from opening on its own; it does not mark
|
|
18
|
+
the tour as completed. If you remove it later, users who never finished
|
|
19
|
+
the tour see it again on their next load. An unrecognized value (for
|
|
20
|
+
example `NBI_TOUR_DISABLED=ture`) logs a warning and falls back to the
|
|
21
|
+
traitlet instead of stopping the extension from loading.
|
|
22
|
+
|
|
9
23
|
## Where to put the file
|
|
10
24
|
|
|
11
25
|
Anywhere readable by the Jupyter server process. A common pattern on
|
|
@@ -42,7 +42,10 @@ code) is configured in Settings → Chatbook; see [`chatbook.md`](chatbook.md).
|
|
|
42
42
|
|
|
43
43
|
Subclass `ChatbookMentionProvider` to add a browsable root. List item values are
|
|
44
44
|
provider-local opaque strings; NBI namespaces them as
|
|
45
|
-
`@ext:<provider-id>:<value
|
|
45
|
+
`@ext:<provider-id>:<value>`, or `@ext:"<provider-id>:<value>"` when the value
|
|
46
|
+
contains whitespace or `@`. `resolve_mention` receives the value exactly as written:
|
|
47
|
+
unlike file and folder mentions, trailing punctuation is not trimmed, because
|
|
48
|
+
only the provider knows whether it is part of the value.
|
|
46
49
|
|
|
47
50
|
```python
|
|
48
51
|
from notebook_intelligence import (
|
|
@@ -14,9 +14,9 @@ Cell badges show **NL** (natural language) and **Cd** (code). Code cells use the
|
|
|
14
14
|
|
|
15
15
|
## Writing cells
|
|
16
16
|
|
|
17
|
-
Every cell is either a natural-language prompt (**NL**) or ordinary code (**Cd**), and the badge at the top of the cell shows which. The badge is a button: click it to switch that cell. `Ctrl J` switches the active cell and `Ctrl Shift J` switches every cell in the notebook. Both are literal `Ctrl`, including on macOS, where most JupyterLab bindings use `Cmd`. The notebook toolbar carries the same switch-all action and an export button.
|
|
17
|
+
Every cell is either a natural-language prompt (**NL**) or ordinary code (**Cd**), and the badge at the top of the cell shows which. The badge is a button: click it to switch that cell. `Ctrl J` switches the active cell and `Ctrl Shift J` switches every cell in the notebook. Both are literal `Ctrl`, including on macOS, where most JupyterLab bindings use `Cmd`. The notebook toolbar carries the same switch-all action and an export button, and ordinary notebooks get a button to convert them to a Chatbook.
|
|
18
18
|
|
|
19
|
-
Chatbook adds
|
|
19
|
+
Chatbook adds seven commands, all reachable from the command palette:
|
|
20
20
|
|
|
21
21
|
| Command | What it does |
|
|
22
22
|
| ------------------------------- | ------------------------------------------------------------------ |
|
|
@@ -26,6 +26,7 @@ Chatbook adds six commands, all reachable from the command palette:
|
|
|
26
26
|
| Show generated code | Opens the code a prompt cell generated, which is otherwise hidden. |
|
|
27
27
|
| Refresh English representation | Regenerates the English description of a code cell. |
|
|
28
28
|
| Export as code notebook | Writes a plain notebook for the backend language. |
|
|
29
|
+
| Convert notebook to Chatbook | Writes a Chatbook copy of an ordinary notebook. |
|
|
29
30
|
|
|
30
31
|
**Running a code cell also sends it to the model.** The first time a **Cd** cell runs successfully, Chatbook asks the model for a one-line English description of that source and stores it in the cell's metadata, so the cell can be read as prose and switched back to **NL** later. It does not ask again on later runs, and it does not refresh the description when you edit the code: use **Refresh English representation** for that. This is worth knowing in a deployment where code is more sensitive than prompts, because it means hand-written code in a Chatbook reaches the model even under **Always confirm**.
|
|
31
32
|
|
|
@@ -33,13 +34,25 @@ Chatbook adds six commands, all reachable from the command palette:
|
|
|
33
34
|
|
|
34
35
|
Typing `@` in a prompt cell opens a menu of context to attach. The built-in **Files & folders** provider browses the Jupyter root, skipping dotfiles, `__pycache__`, and `node_modules`; a selected file is read and truncated at 16,000 characters. Extensions can register providers of their own, which appear in the same menu under their own root (see [`chatbook-extensions.md`](chatbook-extensions.md)).
|
|
35
36
|
|
|
37
|
+
A mention ends at the first whitespace or `@`, so a path that contains either is written in double quotes, `@file:"data/my notes.md"`; the menu inserts that form for you. A quoted path is taken exactly as written and cannot contain a double quote or a line break, so a name with a double quote can only be mentioned when it needs no quoting, and a name that itself begins and ends with a double quote cannot be mentioned at all.
|
|
38
|
+
|
|
39
|
+
Sentence punctuation typed right after an unquoted file or folder mention (`.` `,` `;` `:` `!` `?` and `…`, closing brackets and quotes, and their full-width forms) is not part of the path, so `Summarize @file:data/README.md, then chart it` refers to `data/README.md`. The name as written is tried first, then with up to five of those characters removed one at a time, and the first name that exists is used even if it cannot be read. So a file whose real name ends in punctuation still resolves, and a shorter name is never reached past one that exists. Other characters, such as `+` or `-`, are always part of the path.
|
|
40
|
+
|
|
36
41
|
Mentions work only in prompt cells. A prompt that carries one is regenerated every run rather than reusing the previously approved code, because the mentioned content may have changed since.
|
|
37
42
|
|
|
43
|
+
## Convert a notebook to a Chatbook
|
|
44
|
+
|
|
45
|
+
**Convert notebook to Chatbook** is the reverse of [export](#export-as-a-code-notebook). It appears as a toolbar button on ordinary notebooks and in the command palette, and writes a Chatbook copy next to the original, named after it with `-chatbook` appended (`analysis.ipynb` becomes `analysis-chatbook.ipynb`, and a number is added if that name is taken). The copy opens straight away, and the original is left untouched. It converts what is in the editor, so unsaved changes are included.
|
|
46
|
+
|
|
47
|
+
Every code cell becomes a **Cd** cell and 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, still hold their prompts and stay natural language. Any other natural-language cell in it would become a code cell holding English, so switch such a Chatbook back to the Chatbook kernel rather than converting it. Everything else is kept: markdown and raw cells, outputs, execution counts, attachments, and other notebook metadata; only the kernelspec and language info become Chatbook's. Conversion itself sends nothing to the model. As with any **Cd** cell, the first time a converted cell without an English description runs successfully, its code is sent to the model for a one-line description. A description a cell already carries is kept only when it is known to describe that exact code, as for a Chatbook that was exported and is converted back.
|
|
48
|
+
|
|
49
|
+
Chatbook runs code in the one backend kernel chosen in Settings → **Chatbook**, so conversion compares the notebook's language with it first. A notebook in the same language converts, with a note when its kernel differs from the backend, and so does a notebook that records no language. A notebook in another language (an R notebook while the backend is Python) is not converted, because every code cell would fail; the dialog explains why and, when a kernel for that language is installed, offers to open the Chatbook settings. Conversion never changes that setting itself, since it applies to every Chatbook. When the notebook names its kernel, that name is recorded in the copy's metadata under `nbi.chatbook.sourceKernel`.
|
|
50
|
+
|
|
38
51
|
## Export as a code notebook
|
|
39
52
|
|
|
40
53
|
**Export as code notebook** writes a plain notebook for the backend language next to the original, named after it with the language appended (`analysis.ipynb` becomes `analysis-python.ipynb`, and a number is added if that name is taken). The Chatbook itself is left untouched.
|
|
41
54
|
|
|
42
|
-
Prompt cells become their generated code. A prompt cell whose code never ran, or whose prompt changed since it last ran, is written as line comments instead, so an export never passes off code as having been executed when it was not. The exported notebook's `kernelspec` and `language_info` are rewritten to the backend kernel. Export fails if the backend language has no line-comment syntax Chatbook knows, since there would be no way to write those cells safely.
|
|
55
|
+
Prompt cells become their generated code. A prompt cell whose code never ran, or whose prompt changed since it last ran, is written as line comments instead, so an export never passes off code as having been executed when it was not. A code cell switched to natural language exports its own code, as any code cell does, while its English side is empty or is still the description of that code. Once either side changes, it is written as comments too; after editing the code, **Refresh English representation** brings the description back in step. The exported notebook's `kernelspec` and `language_info` are rewritten to the backend kernel. Export fails if the backend language has no line-comment syntax Chatbook knows, since there would be no way to write those cells safely.
|
|
43
56
|
|
|
44
57
|
## What the notebook file holds
|
|
45
58
|
|
|
@@ -33,7 +33,26 @@ MAX_PROVIDER_CONTEXT_CHARS = 16_000
|
|
|
33
33
|
MAX_DIRECTORY_ITEMS = 100
|
|
34
34
|
BUILTIN_SKIPPED_DIRECTORIES = frozenset({"__pycache__", "node_modules"})
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
# A mention is either quoted, `@file:"data/my notes.md"`, which is how a path
|
|
37
|
+
# containing whitespace or `@` is written, or unquoted and runs to the next
|
|
38
|
+
# whitespace. The quoted form follows Claude Code (`@"path"`) and Codex, which
|
|
39
|
+
# quotes a picked path containing whitespace. NUI's mention parser
|
|
40
|
+
# (plmbr/nui internal/mentions) is meant to accept the same tokens (#503), so
|
|
41
|
+
# change the two together.
|
|
42
|
+
MENTION_TOKEN_RE = re.compile(
|
|
43
|
+
r'(?<![\w@])@(?:(file|dir|ext):"([^"\n\r\x85\u2028\u2029]+)"(?![\w"])|([^\s@]+))'
|
|
44
|
+
)
|
|
45
|
+
# Sentence punctuation typed after an unquoted file or dir mention
|
|
46
|
+
# (`see @file:notes.md,`) is not part of the path. This follows Claude Code,
|
|
47
|
+
# but only for sentence punctuation: `+` or `-` stay part of the name. The
|
|
48
|
+
# characters are removed one at a time, at most a few, stopping at the first
|
|
49
|
+
# candidate that exists, so a name that really ends in one of them still
|
|
50
|
+
# resolves and a shorter, unrelated name is never reached past it.
|
|
51
|
+
TRAILING_PUNCTUATION = frozenset(
|
|
52
|
+
".,;:!?)]}'\"\u2026\u201d\u2019\u00bb"
|
|
53
|
+
"\u3002\u3001\uff0c\uff1b\uff1a\uff01\uff1f\uff09\u300d\u300f"
|
|
54
|
+
)
|
|
55
|
+
MAX_TRAILING_PUNCTUATION = 5
|
|
37
56
|
|
|
38
57
|
|
|
39
58
|
def _root_path() -> Path:
|
|
@@ -217,26 +236,72 @@ def list_chatbook_mentions(
|
|
|
217
236
|
)
|
|
218
237
|
|
|
219
238
|
|
|
220
|
-
def
|
|
221
|
-
"""Return
|
|
222
|
-
result: list[tuple[str, str]] = []
|
|
223
|
-
seen: set[tuple[str, str]] = set()
|
|
239
|
+
def _parse_mention_tokens(prompt: str) -> list[tuple[str, str, bool, str]]:
|
|
240
|
+
"""Return (kind, value, quoted, token as written), once each, in order."""
|
|
241
|
+
result: list[tuple[str, str, bool, str]] = []
|
|
242
|
+
seen: set[tuple[str, str, bool]] = set()
|
|
224
243
|
for match in MENTION_TOKEN_RE.finditer(prompt or ""):
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
item = ("file", value.removeprefix("file:"))
|
|
228
|
-
elif value.startswith("dir:"):
|
|
229
|
-
item = ("dir", value.removeprefix("dir:"))
|
|
230
|
-
elif value.startswith(EXTENSION_ROOT_PREFIX):
|
|
231
|
-
item = ("ext", value.removeprefix(EXTENSION_ROOT_PREFIX))
|
|
244
|
+
if match.group(1):
|
|
245
|
+
kind, value, quoted = match.group(1), match.group(2), True
|
|
232
246
|
else:
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
247
|
+
raw = match.group(3)
|
|
248
|
+
kind, separator, value = raw.partition(":")
|
|
249
|
+
if kind not in ("file", "dir", "ext") or not separator:
|
|
250
|
+
continue
|
|
251
|
+
quoted = False
|
|
252
|
+
if (kind, value, quoted) not in seen:
|
|
253
|
+
seen.add((kind, value, quoted))
|
|
254
|
+
result.append((kind, value, quoted, match.group(0)))
|
|
237
255
|
return result
|
|
238
256
|
|
|
239
257
|
|
|
258
|
+
def _path_candidates(value: str, quoted: bool) -> list[str]:
|
|
259
|
+
"""The path as written, then with trailing punctuation removed one by one."""
|
|
260
|
+
candidates = [value]
|
|
261
|
+
if quoted:
|
|
262
|
+
return candidates
|
|
263
|
+
while (
|
|
264
|
+
len(candidates) <= MAX_TRAILING_PUNCTUATION
|
|
265
|
+
and len(candidates[-1]) > 1
|
|
266
|
+
and candidates[-1][-1] in TRAILING_PUNCTUATION
|
|
267
|
+
):
|
|
268
|
+
candidates.append(candidates[-1][:-1])
|
|
269
|
+
return candidates
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def _locate_mention_path(
|
|
273
|
+
kind: str,
|
|
274
|
+
value: str,
|
|
275
|
+
quoted: bool,
|
|
276
|
+
root: Path,
|
|
277
|
+
skipped_directories: Iterable[str],
|
|
278
|
+
) -> tuple[Path | None, tuple[str, str]]:
|
|
279
|
+
"""Find the path a file or dir mention names, and the key to dedupe it on.
|
|
280
|
+
|
|
281
|
+
Returns the first candidate that exists, even if it later cannot be read.
|
|
282
|
+
A refused candidate ends the search, so trimming never steps past it.
|
|
283
|
+
"""
|
|
284
|
+
candidates = _path_candidates(value, quoted)
|
|
285
|
+
for candidate in candidates:
|
|
286
|
+
try:
|
|
287
|
+
path = _safe_relative_path(candidate, skipped_directories)
|
|
288
|
+
if path.exists():
|
|
289
|
+
return path, (kind, _relative_display(path, root))
|
|
290
|
+
except (OSError, RuntimeError, UnicodeError, ValueError):
|
|
291
|
+
return None, (kind, candidate)
|
|
292
|
+
return None, (kind, candidates[-1])
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def parse_chatbook_mentions(prompt: str) -> list[tuple[str, str]]:
|
|
296
|
+
"""Return (kind, value as written) for each mention, in prompt order.
|
|
297
|
+
|
|
298
|
+
A value is not yet a path: trailing punctuation is trimmed only when the
|
|
299
|
+
mention is resolved. The same text written quoted and unquoted appears
|
|
300
|
+
twice, because the two can resolve differently.
|
|
301
|
+
"""
|
|
302
|
+
return [(kind, value) for kind, value, _, _ in _parse_mention_tokens(prompt)]
|
|
303
|
+
|
|
304
|
+
|
|
240
305
|
def resolve_chatbook_mentions(
|
|
241
306
|
prompt: str,
|
|
242
307
|
skipped_directories: Iterable[str] = (),
|
|
@@ -248,7 +313,7 @@ def resolve_chatbook_mentions(
|
|
|
248
313
|
context_hash: str = "",
|
|
249
314
|
) -> list[dict[str, str]]:
|
|
250
315
|
"""Resolve mention tokens into bounded, soft-failing reference context."""
|
|
251
|
-
mentions =
|
|
316
|
+
mentions = _parse_mention_tokens(prompt)
|
|
252
317
|
if not mentions:
|
|
253
318
|
return []
|
|
254
319
|
root = _root_path()
|
|
@@ -256,9 +321,13 @@ def resolve_chatbook_mentions(
|
|
|
256
321
|
current = (notebook_context or {}).get("current") or {}
|
|
257
322
|
cell_index = current.get("index") if isinstance(current, dict) else None
|
|
258
323
|
resolved: list[dict[str, str]] = []
|
|
259
|
-
|
|
260
|
-
|
|
324
|
+
resolved_keys: set[tuple[str, str]] = set()
|
|
325
|
+
for kind, relative, quoted, token in mentions:
|
|
261
326
|
if kind == "ext":
|
|
327
|
+
# Quoted and unquoted spellings name the same provider value.
|
|
328
|
+
if ("ext", relative) in resolved_keys:
|
|
329
|
+
continue
|
|
330
|
+
resolved_keys.add(("ext", relative))
|
|
262
331
|
provider_id, value = _split_extension_mention(relative)
|
|
263
332
|
provider = provider_by_id.get(provider_id)
|
|
264
333
|
try:
|
|
@@ -302,32 +371,29 @@ def resolve_chatbook_mentions(
|
|
|
302
371
|
}
|
|
303
372
|
)
|
|
304
373
|
continue
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
"available": "false",
|
|
329
|
-
}
|
|
330
|
-
)
|
|
374
|
+
path, key = _locate_mention_path(
|
|
375
|
+
kind, relative, quoted, root, skipped_directories
|
|
376
|
+
)
|
|
377
|
+
if key in resolved_keys:
|
|
378
|
+
continue
|
|
379
|
+
resolved_keys.add(key)
|
|
380
|
+
entry = {
|
|
381
|
+
"token": token,
|
|
382
|
+
"kind": kind,
|
|
383
|
+
"path": key[1] if path is not None else relative,
|
|
384
|
+
"content": "[unavailable]",
|
|
385
|
+
"available": "false",
|
|
386
|
+
}
|
|
387
|
+
if path is not None:
|
|
388
|
+
try:
|
|
389
|
+
if kind == "file":
|
|
390
|
+
content = _read_text_file(path)
|
|
391
|
+
else:
|
|
392
|
+
content = _list_directory(path)
|
|
393
|
+
entry.update(content=content, available="true")
|
|
394
|
+
except (OSError, RuntimeError, UnicodeError, ValueError):
|
|
395
|
+
pass
|
|
396
|
+
resolved.append(entry)
|
|
331
397
|
return resolved
|
|
332
398
|
|
|
333
399
|
|
{notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/extension.py
RENAMED
|
@@ -453,6 +453,20 @@ def _resolve_bool_with_env(env_var_name: str, fallback: bool | None) -> bool:
|
|
|
453
453
|
)
|
|
454
454
|
|
|
455
455
|
|
|
456
|
+
def _resolve_tour_disabled(traitlet_value: bool | None) -> bool:
|
|
457
|
+
"""Resolve NBI_TOUR_DISABLED, falling back to the traitlet.
|
|
458
|
+
|
|
459
|
+
Unlike the security gates this is a cosmetic switch, so an unrecognized
|
|
460
|
+
value warns and falls back instead of raising: a typo must not stop the
|
|
461
|
+
whole extension from loading.
|
|
462
|
+
"""
|
|
463
|
+
try:
|
|
464
|
+
return _resolve_bool_with_env("NBI_TOUR_DISABLED", traitlet_value)
|
|
465
|
+
except ValueError as exc:
|
|
466
|
+
log.warning("%s; falling back to the tour_disabled setting", exc)
|
|
467
|
+
return bool(traitlet_value)
|
|
468
|
+
|
|
469
|
+
|
|
456
470
|
def _resolve_positive_int_with_env(env_var_name: str, traitlet_value: int) -> int:
|
|
457
471
|
"""Resolve a non-negative int tunable, falling back to the traitlet.
|
|
458
472
|
|
|
@@ -769,6 +783,9 @@ class GetCapabilitiesHandler(APIHandler):
|
|
|
769
783
|
# Resolved at extension init from NBI_TOUR_CONFIG_PATH (or the
|
|
770
784
|
# tour_config_path traitlet). Empty string disables the override.
|
|
771
785
|
tour_config_path = ""
|
|
786
|
+
# Resolved at extension init from NBI_TOUR_DISABLED (or the
|
|
787
|
+
# tour_disabled traitlet). Suppresses only the first-run auto-show.
|
|
788
|
+
tour_disabled = False
|
|
772
789
|
|
|
773
790
|
@tornado.web.authenticated
|
|
774
791
|
def get(self):
|
|
@@ -966,6 +983,7 @@ class GetCapabilitiesHandler(APIHandler):
|
|
|
966
983
|
# unset, so the cost is at most one stat call per request. The
|
|
967
984
|
# path itself is pre-resolved at initialize_handlers time.
|
|
968
985
|
response["tour_overrides"] = load_tour_config(self.tour_config_path)
|
|
986
|
+
response["tour_disabled"] = self.tour_disabled
|
|
969
987
|
|
|
970
988
|
self.finish(json.dumps(response))
|
|
971
989
|
|
|
@@ -4530,6 +4548,17 @@ class NotebookIntelligence(ExtensionApp):
|
|
|
4530
4548
|
config=True,
|
|
4531
4549
|
)
|
|
4532
4550
|
|
|
4551
|
+
tour_disabled = Bool(
|
|
4552
|
+
default_value=False,
|
|
4553
|
+
help="""
|
|
4554
|
+
Suppress the in-app first-run tour. The tour no longer opens on its
|
|
4555
|
+
own; the "Show NBI tour" command still replays it on demand.
|
|
4556
|
+
Overridden by the NBI_TOUR_DISABLED environment variable.
|
|
4557
|
+
""",
|
|
4558
|
+
allow_none=True,
|
|
4559
|
+
config=True,
|
|
4560
|
+
)
|
|
4561
|
+
|
|
4533
4562
|
def initialize_settings(self):
|
|
4534
4563
|
warm_tokenizer_encoding()
|
|
4535
4564
|
|
|
@@ -4734,6 +4763,9 @@ class NotebookIntelligence(ExtensionApp):
|
|
|
4734
4763
|
os.environ.get("NBI_TOUR_CONFIG_PATH", "").strip()
|
|
4735
4764
|
or (self.tour_config_path or "").strip()
|
|
4736
4765
|
)
|
|
4766
|
+
GetCapabilitiesHandler.tour_disabled = _resolve_tour_disabled(
|
|
4767
|
+
self.tour_disabled
|
|
4768
|
+
)
|
|
4737
4769
|
SkillsBaseHandler.allow_github_skill_import = _resolve_bool_with_env(
|
|
4738
4770
|
"NBI_ALLOW_GITHUB_SKILL_IMPORT", self.allow_github_skill_import
|
|
4739
4771
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plmbr/notebook-intelligence",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.2.0",
|
|
4
4
|
"description": "AI coding assistant for JupyterLab",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"AI",
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
}
|
|
177
177
|
},
|
|
178
178
|
"_build": {
|
|
179
|
-
"load": "static/remoteEntry.
|
|
179
|
+
"load": "static/remoteEntry.10c9ca7e4b3cffb98413.js",
|
|
180
180
|
"extension": "./extension",
|
|
181
181
|
"style": "./style"
|
|
182
182
|
}
|