notebook-intelligence 6.1.0__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.1.0 → notebook_intelligence-6.2.0}/PKG-INFO +1 -1
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/docs/chatbook-extensions.md +4 -1
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/docs/chatbook.md +16 -3
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/_version.py +1 -1
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_mentions.py +111 -45
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/package.json +2 -2
- {notebook_intelligence-6.1.0 → 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/editor.worker.js +1407 -0
- notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/remoteEntry.10c9ca7e4b3cffb98413.js +1 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/package.json +1 -1
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_chatbook.py +272 -2
- notebook_intelligence-6.2.0/tests/ts/chatbook-convert.test.ts +106 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/chatbook-mentions-menu.test.ts +41 -0
- {notebook_intelligence-6.1.0 → 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.1.0 → notebook_intelligence-6.2.0}/tests/ts/chatbook.test.ts +530 -0
- notebook_intelligence-6.1.0/notebook_intelligence/labextension/static/701.fba10740dad4e976203f.js +0 -1
- notebook_intelligence-6.1.0/notebook_intelligence/labextension/static/editor.worker.js +0 -1407
- notebook_intelligence-6.1.0/notebook_intelligence/labextension/static/remoteEntry.e5f6a45f75a47d403e5b.js +0 -1
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.copier-answers.yml +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.editorconfig +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.gitignore +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/.gitignore +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/applypatch-msg +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/commit-msg +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/h +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/husky.sh +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/post-applypatch +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/post-checkout +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/post-commit +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/post-merge +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/post-rewrite +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/pre-applypatch +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/pre-auto-gc +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/pre-commit +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/pre-merge-commit +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/pre-push +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/pre-rebase +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/_/prepare-commit-msg +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.husky/pre-commit +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.prettierignore +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.vscode/extensions.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.vscode/settings.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/.yarnrc.yml +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/AGENTS.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/CHANGELOG.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/CLAUDE.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/CONTRIBUTING.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/LICENSE +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/PRIVACY.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/README.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/RELEASE.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/SECURITY.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/README.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/bench_runner.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/bench_terminal.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/prompts.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/report.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/stats.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/docs/acp.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/docs/admin-guide.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/docs/admin-tour-config.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/docs/performance-diagnostics.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/docs/rulesets.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/docs/skills.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/docs/troubleshooting.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/install.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/jest.config.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/jupyter-config/server-config/notebook_intelligence.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/__init__.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/_claude_cli.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/acp_agent.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/acp_mcp_server.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/acp_registry.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/ai_service_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/api.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/base_chat_participant.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/built_in_toolsets.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/cell_output.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chat_history_budget.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_generate.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/__init__.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/__main__.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/backend.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/codegen.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/danger.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/execution.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/kernel.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/kernelspec/kernel.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/kernelspec/logo-svg.svg +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/nbi_client.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/checks.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/claude.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/claude_mcp_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/claude_sessions.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/config.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/context_factory.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/extension.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/feature_flags.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/github_copilot.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/inline_completion.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/156.7e517ead254858a9eb50.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/196.ae4c84cd4812d9d7cbcf.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/24c0eed6cf7014abfb18.module.wasm +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/537.e250b395dd56252f433b.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/631.c3b7a19d8e9bb293fff8.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/671.dd4f3f162a9464547691.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/694.97c3499ce07ad99e125a.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/728.5359de99fbe302f4380b.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/768.7edd3110b64beb9041b7.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/938a2c885cbaa713e543.module.wasm +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/976.7dffd54c5614c4e8083f.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/style.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/third-party-licenses.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_client.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_config_validation.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_policy.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_ui_proxy.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/perf.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/perf_probe.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/plugin_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/prompts.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/readiness.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/rule_injector.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/rule_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/ruleset.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_github_import.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_manifest.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_reconciler.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/skillset.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/tour_config.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/notebook_intelligence/util.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/pyproject.toml +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/schema/plugin.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/setup.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/conftest.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/fixtures/rules/01-test-global.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/fixtures/rules/02-test-security.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/fixtures/rules/03-invalid-rule.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_acp_agent.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_ai_service_manager_dispatch.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_ai_service_manager_integration.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_api_hygiene.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_base_chat_participant_integration.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_builtin_cell_output.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_builtin_file_read.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_builtin_search_files_sandbox.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_cell_output.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_cell_output_features_response.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_chat_history_budget.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_chatbook_backend.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_chatbook_danger.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_chatbook_enable.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_chatbook_perf.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_bash_approval_rendering.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_client.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_mcp_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_models.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_sdk_mcp_server.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_sessions.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_sessions_handler.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_system_prompt.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_tool_humanizer.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_tool_path_sandbox.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_tool_results.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_claude_turn_usage.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_coding_agent_launchers.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_config_atomic_save.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_config_handler_claude_settings.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_config_integration.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_context_factory.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_default_password_refusal.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_disabled_provider_models.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_enabled_providers_env.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_end_to_end_rule_integration.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_feature_flags.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_feedback.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_file_upload.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_github_copilot_llm_provider.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_github_copilot_login_gating.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_github_copilot_user_data_mode.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_image_context.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_inline_completion_shortcuts.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_lazy_provider_imports.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_litellm_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_mcp_client_shim.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_mcp_config_validation.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_mcp_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_mcp_manager_command_allowlist.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_mcp_null_config.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_mcp_policy.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_models.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_openai_compatible_llm_provider.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_perf.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_perf_instrumentation.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_perf_probe.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_permission_modes.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_plugin_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_policy_gate.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_process_tree_teardown.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_provider_stream_cancellation.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_readiness.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_redact_process_secrets.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_response_emitter.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_rule_auto_reload.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_rule_injector.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_rule_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_run_ui_command_allowlist_parity.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_safe_anchor_uri.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_skill_fetch_redirects.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_skill_github_import.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_skill_manager.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_skill_manifest.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_skill_reconciler.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_skills_handlers.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_tour_config.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_tour_disabled.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_user_input_wait.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_websocket_handler_integration.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_ws_callback_handler_leak.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/test_ws_handler_auth.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/jupyterlab-apputils.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/strip-ansi.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/svg.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/tiktoken.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/ask-user-question.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/cell-output-bundle.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/cell-output-features.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/cell-output-toolbar.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/chat-cancel.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/chat-prefix-suggestions.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/chat-progress-feedback.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/chat-stopped-turn.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/chat-transcript.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/chatbook-execute.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/checkbox.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/choose-workspace-directory.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/claude-mcp-paste.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/coding-agent-launchers.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/confirmation-details.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/inline-completer-telemetry.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/inline-completion-origin.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/inline-completion-request.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/launcher-picker.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/markdown-code-class.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/markdown-renderer.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/mcp-config-save.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/mcp-config-temp-file.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/mcp-util.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/notebook-generation.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/open-file-refresh-watcher.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/perf-panel.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/permission-mode-select.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/plugins-panel.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/readiness-card.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/response-stream-command-allowlist.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/safe-anchor.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/select-theme-css.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/settings-property-field.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/settings-required-property.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/settings-tab-name.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/setup.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/skill-wire-format.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/task-target-notebook.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/terminal-drag.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/tool-call-card.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/tool-call-group.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/tool-call-stream.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/tour-config.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/tour-events.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/tour-overlay.test.tsx +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/tour-state.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/tsconfig.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/utils.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tests/ts/workspace-skips.test.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/tsconfig.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/.eslintrc.js +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/README.md +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/jupyter_server_test_config.py +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/package.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/playwright.config.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/tests/cell-output.spec.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/tests/chatbook-cell-mode-badge.spec.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/tests/extension.spec.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/tests/helpers.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/tests/launcher.spec.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/tsconfig.json +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/ui-tests/yarn.lock +0 -0
- {notebook_intelligence-6.1.0 → notebook_intelligence-6.2.0}/webpack.config.js +0 -0
- {notebook_intelligence-6.1.0 → 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.
|
|
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
|
|
@@ -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
|
|
|
@@ -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
|
}
|