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.
Files changed (317) hide show
  1. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/PKG-INFO +2 -2
  2. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/admin-guide.md +2 -0
  3. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/admin-tour-config.md +14 -0
  4. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/chatbook-extensions.md +4 -1
  5. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/chatbook.md +16 -3
  6. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/_version.py +1 -1
  7. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_mentions.py +111 -45
  8. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/extension.py +32 -0
  9. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/package.json +2 -2
  10. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/package.json.orig +1 -1
  11. notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/7.b660d984046388f395e5.js +1 -0
  12. notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/728.5359de99fbe302f4380b.js +1 -0
  13. notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/editor.worker.js +1407 -0
  14. notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/remoteEntry.10c9ca7e4b3cffb98413.js +1 -0
  15. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/package.json +1 -1
  16. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/pyproject.toml +12 -5
  17. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook.py +272 -2
  18. notebook_intelligence-6.2.0/tests/test_tour_disabled.py +119 -0
  19. notebook_intelligence-6.2.0/tests/ts/chat-prefix-suggestions.test.ts +140 -0
  20. notebook_intelligence-6.2.0/tests/ts/chatbook-convert.test.ts +106 -0
  21. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chatbook-mentions-menu.test.ts +41 -0
  22. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chatbook-mentions.test.ts +32 -0
  23. notebook_intelligence-6.2.0/tests/ts/chatbook-summarize.test.ts +95 -0
  24. notebook_intelligence-6.2.0/tests/ts/chatbook-toolbar-convert.test.ts +241 -0
  25. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chatbook.test.ts +530 -0
  26. notebook_intelligence-6.2.0/tests/ts/select-theme-css.test.ts +66 -0
  27. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tour-state.test.ts +23 -1
  28. notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/701.98cf201a781644814727.js +0 -1
  29. notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/728.7f069be896fa3f595701.js +0 -1
  30. notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/editor.worker.js +0 -1407
  31. notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/remoteEntry.342cef7bc2948099c0d0.js +0 -1
  32. notebook_intelligence-6.0.0a3/tests/ts/chat-prefix-suggestions.test.ts +0 -55
  33. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.copier-answers.yml +0 -0
  34. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.editorconfig +0 -0
  35. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.gitignore +0 -0
  36. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/.gitignore +0 -0
  37. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/applypatch-msg +0 -0
  38. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/commit-msg +0 -0
  39. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/h +0 -0
  40. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/husky.sh +0 -0
  41. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-applypatch +0 -0
  42. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-checkout +0 -0
  43. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-commit +0 -0
  44. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-merge +0 -0
  45. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/post-rewrite +0 -0
  46. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-applypatch +0 -0
  47. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-auto-gc +0 -0
  48. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-commit +0 -0
  49. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-merge-commit +0 -0
  50. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-push +0 -0
  51. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/pre-rebase +0 -0
  52. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/_/prepare-commit-msg +0 -0
  53. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.husky/pre-commit +0 -0
  54. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.prettierignore +0 -0
  55. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.vscode/extensions.json +0 -0
  56. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.vscode/settings.json +0 -0
  57. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/.yarnrc.yml +0 -0
  58. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/AGENTS.md +0 -0
  59. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/CHANGELOG.md +0 -0
  60. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/CLAUDE.md +0 -0
  61. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/CONTRIBUTING.md +0 -0
  62. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/LICENSE +0 -0
  63. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/PRIVACY.md +0 -0
  64. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/README.md +0 -0
  65. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/RELEASE.md +0 -0
  66. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/SECURITY.md +0 -0
  67. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/README.md +0 -0
  68. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
  69. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/bench_runner.py +0 -0
  70. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/bench_terminal.py +0 -0
  71. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/prompts.py +0 -0
  72. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/report.py +0 -0
  73. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/benchmarks/claude_perf/stats.py +0 -0
  74. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/acp.md +0 -0
  75. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/performance-diagnostics.md +0 -0
  76. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/rulesets.md +0 -0
  77. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/skills.md +0 -0
  78. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/docs/troubleshooting.md +0 -0
  79. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/install.json +0 -0
  80. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/jest.config.js +0 -0
  81. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/jupyter-config/server-config/notebook_intelligence.json +0 -0
  82. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/__init__.py +0 -0
  83. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/_claude_cli.py +0 -0
  84. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/acp_agent.py +0 -0
  85. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/acp_mcp_server.py +0 -0
  86. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/acp_registry.py +0 -0
  87. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/ai_service_manager.py +0 -0
  88. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/api.py +0 -0
  89. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/base_chat_participant.py +0 -0
  90. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/built_in_toolsets.py +0 -0
  91. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/cell_output.py +0 -0
  92. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chat_history_budget.py +0 -0
  93. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_generate.py +0 -0
  94. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/__init__.py +0 -0
  95. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/__main__.py +0 -0
  96. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/backend.py +0 -0
  97. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/codegen.py +0 -0
  98. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/danger.py +0 -0
  99. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/execution.py +0 -0
  100. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/kernel.py +0 -0
  101. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/kernelspec/kernel.json +0 -0
  102. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/kernelspec/logo-svg.svg +0 -0
  103. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/chatbook_kernel/nbi_client.py +0 -0
  104. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/checks.py +0 -0
  105. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/claude.py +0 -0
  106. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/claude_mcp_manager.py +0 -0
  107. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/claude_sessions.py +0 -0
  108. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/config.py +0 -0
  109. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/context_factory.py +0 -0
  110. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/feature_flags.py +0 -0
  111. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/github_copilot.py +0 -0
  112. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
  113. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/inline_completion.py +0 -0
  114. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +0 -0
  115. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/156.7e517ead254858a9eb50.js +0 -0
  116. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/196.ae4c84cd4812d9d7cbcf.js +0 -0
  117. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
  118. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/24c0eed6cf7014abfb18.module.wasm +0 -0
  119. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js +0 -0
  120. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js.LICENSE.txt +0 -0
  121. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/537.e250b395dd56252f433b.js +0 -0
  122. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/631.c3b7a19d8e9bb293fff8.js +0 -0
  123. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js +0 -0
  124. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js.LICENSE.txt +0 -0
  125. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/671.dd4f3f162a9464547691.js +0 -0
  126. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/694.97c3499ce07ad99e125a.js +0 -0
  127. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/768.7edd3110b64beb9041b7.js +0 -0
  128. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/938a2c885cbaa713e543.module.wasm +0 -0
  129. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/976.7dffd54c5614c4e8083f.js +0 -0
  130. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
  131. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/style.js +0 -0
  132. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/labextension/static/third-party-licenses.json +0 -0
  133. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
  134. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
  135. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
  136. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
  137. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_client.py +0 -0
  138. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_config_validation.py +0 -0
  139. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_manager.py +0 -0
  140. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_policy.py +0 -0
  141. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/mcp_ui_proxy.py +0 -0
  142. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/perf.py +0 -0
  143. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/perf_probe.py +0 -0
  144. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/plugin_manager.py +0 -0
  145. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/prompts.py +0 -0
  146. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/readiness.py +0 -0
  147. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/rule_injector.py +0 -0
  148. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/rule_manager.py +0 -0
  149. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/ruleset.py +0 -0
  150. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_github_import.py +0 -0
  151. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_manager.py +0 -0
  152. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_manifest.py +0 -0
  153. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skill_reconciler.py +0 -0
  154. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/skillset.py +0 -0
  155. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/tour_config.py +0 -0
  156. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/notebook_intelligence/util.py +0 -0
  157. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/schema/plugin.json +0 -0
  158. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/setup.py +0 -0
  159. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/conftest.py +0 -0
  160. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/01-test-global.md +0 -0
  161. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/02-test-security.md +0 -0
  162. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/03-invalid-rule.md +0 -0
  163. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
  164. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
  165. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
  166. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_acp_agent.py +0 -0
  167. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_ai_service_manager_dispatch.py +0 -0
  168. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_ai_service_manager_integration.py +0 -0
  169. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_api_hygiene.py +0 -0
  170. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_base_chat_participant_integration.py +0 -0
  171. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_builtin_cell_output.py +0 -0
  172. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_builtin_file_read.py +0 -0
  173. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_builtin_search_files_sandbox.py +0 -0
  174. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
  175. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_cell_output.py +0 -0
  176. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_cell_output_features_response.py +0 -0
  177. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chat_history_budget.py +0 -0
  178. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook_backend.py +0 -0
  179. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook_danger.py +0 -0
  180. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook_enable.py +0 -0
  181. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_chatbook_perf.py +0 -0
  182. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_bash_approval_rendering.py +0 -0
  183. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_client.py +0 -0
  184. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_mcp_manager.py +0 -0
  185. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_models.py +0 -0
  186. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_sdk_mcp_server.py +0 -0
  187. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_sessions.py +0 -0
  188. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_sessions_handler.py +0 -0
  189. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_system_prompt.py +0 -0
  190. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_tool_humanizer.py +0 -0
  191. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_tool_path_sandbox.py +0 -0
  192. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_tool_results.py +0 -0
  193. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_claude_turn_usage.py +0 -0
  194. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_coding_agent_launchers.py +0 -0
  195. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_config_atomic_save.py +0 -0
  196. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_config_handler_claude_settings.py +0 -0
  197. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_config_integration.py +0 -0
  198. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_context_factory.py +0 -0
  199. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_default_password_refusal.py +0 -0
  200. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_disabled_provider_models.py +0 -0
  201. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_enabled_providers_env.py +0 -0
  202. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_end_to_end_rule_integration.py +0 -0
  203. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_feature_flags.py +0 -0
  204. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_feedback.py +0 -0
  205. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_file_upload.py +0 -0
  206. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_github_copilot_llm_provider.py +0 -0
  207. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_github_copilot_login_gating.py +0 -0
  208. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_github_copilot_user_data_mode.py +0 -0
  209. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_image_context.py +0 -0
  210. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_inline_completion_shortcuts.py +0 -0
  211. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_lazy_provider_imports.py +0 -0
  212. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_litellm_compatible_llm_provider.py +0 -0
  213. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_client_shim.py +0 -0
  214. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_config_validation.py +0 -0
  215. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_manager.py +0 -0
  216. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_manager_command_allowlist.py +0 -0
  217. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_null_config.py +0 -0
  218. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_mcp_policy.py +0 -0
  219. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_models.py +0 -0
  220. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_openai_compatible_llm_provider.py +0 -0
  221. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_perf.py +0 -0
  222. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_perf_instrumentation.py +0 -0
  223. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_perf_probe.py +0 -0
  224. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_permission_modes.py +0 -0
  225. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_plugin_manager.py +0 -0
  226. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_policy_gate.py +0 -0
  227. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_process_tree_teardown.py +0 -0
  228. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_provider_stream_cancellation.py +0 -0
  229. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_readiness.py +0 -0
  230. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_redact_process_secrets.py +0 -0
  231. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_response_emitter.py +0 -0
  232. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_rule_auto_reload.py +0 -0
  233. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_rule_injector.py +0 -0
  234. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_rule_manager.py +0 -0
  235. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_run_ui_command_allowlist_parity.py +0 -0
  236. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_safe_anchor_uri.py +0 -0
  237. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_fetch_redirects.py +0 -0
  238. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_github_import.py +0 -0
  239. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_manager.py +0 -0
  240. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_manifest.py +0 -0
  241. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skill_reconciler.py +0 -0
  242. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_skills_handlers.py +0 -0
  243. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_tour_config.py +0 -0
  244. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_user_input_wait.py +0 -0
  245. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_websocket_handler_integration.py +0 -0
  246. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_ws_callback_handler_leak.py +0 -0
  247. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/test_ws_handler_auth.py +0 -0
  248. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/jupyterlab-apputils.ts +0 -0
  249. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
  250. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/strip-ansi.ts +0 -0
  251. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/svg.ts +0 -0
  252. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/__mocks__/tiktoken.ts +0 -0
  253. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/ask-user-question.test.tsx +0 -0
  254. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/cell-output-bundle.test.ts +0 -0
  255. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/cell-output-features.test.ts +0 -0
  256. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/cell-output-toolbar.test.ts +0 -0
  257. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chat-cancel.test.ts +0 -0
  258. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chat-progress-feedback.test.ts +0 -0
  259. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chat-stopped-turn.test.ts +0 -0
  260. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chat-transcript.test.ts +0 -0
  261. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/chatbook-execute.test.ts +0 -0
  262. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/checkbox.test.tsx +0 -0
  263. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/choose-workspace-directory.test.ts +0 -0
  264. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/claude-mcp-paste.test.ts +0 -0
  265. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/coding-agent-launchers.test.ts +0 -0
  266. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/confirmation-details.test.tsx +0 -0
  267. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/inline-completer-telemetry.test.ts +0 -0
  268. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/inline-completion-origin.test.ts +0 -0
  269. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/inline-completion-request.test.ts +0 -0
  270. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/launcher-picker.test.tsx +0 -0
  271. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/markdown-code-class.test.ts +0 -0
  272. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/markdown-renderer.test.tsx +0 -0
  273. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/mcp-config-save.test.ts +0 -0
  274. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/mcp-config-temp-file.test.ts +0 -0
  275. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/mcp-util.test.ts +0 -0
  276. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/notebook-generation.test.ts +0 -0
  277. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/open-file-refresh-watcher.test.ts +0 -0
  278. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/perf-panel.test.tsx +0 -0
  279. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/permission-mode-select.test.tsx +0 -0
  280. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/plugins-panel.test.tsx +0 -0
  281. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/readiness-card.test.tsx +0 -0
  282. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/response-stream-command-allowlist.test.ts +0 -0
  283. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/safe-anchor.test.tsx +0 -0
  284. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/settings-property-field.test.tsx +0 -0
  285. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/settings-required-property.test.ts +0 -0
  286. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/settings-tab-name.test.tsx +0 -0
  287. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/setup.ts +0 -0
  288. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/skill-wire-format.test.ts +0 -0
  289. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/task-target-notebook.test.ts +0 -0
  290. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/terminal-drag.test.ts +0 -0
  291. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tool-call-card.test.tsx +0 -0
  292. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tool-call-group.test.tsx +0 -0
  293. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tool-call-stream.test.ts +0 -0
  294. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tour-config.test.ts +0 -0
  295. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tour-events.test.ts +0 -0
  296. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tour-overlay.test.tsx +0 -0
  297. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/tsconfig.json +0 -0
  298. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/utils.test.ts +0 -0
  299. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tests/ts/workspace-skips.test.ts +0 -0
  300. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/tsconfig.json +0 -0
  301. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/.eslintrc.js +0 -0
  302. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/README.md +0 -0
  303. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/jupyter_server_test_config.py +0 -0
  304. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/package.json +0 -0
  305. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/playwright.config.ts +0 -0
  306. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/cell-output.spec.ts +0 -0
  307. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
  308. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/chatbook-cell-mode-badge.spec.ts +0 -0
  309. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
  310. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/extension.spec.ts +0 -0
  311. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/helpers.ts +0 -0
  312. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/launcher.spec.ts +0 -0
  313. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
  314. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/tsconfig.json +0 -0
  315. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/ui-tests/yarn.lock +0 -0
  316. {notebook_intelligence-6.0.0a3 → notebook_intelligence-6.2.0}/webpack.config.js +0 -0
  317. {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.0a3
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==0.10.1
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 six commands, all reachable from the command palette:
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
 
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '6.0.0a3'
4
+ __version__ = VERSION = '6.2.0'
@@ -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
- MENTION_TOKEN_RE = re.compile(r"(?<![\w@])@([^\s@]+)")
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 parse_chatbook_mentions(prompt: str) -> list[tuple[str, str]]:
221
- """Return unique (kind, relative path) mentions, preserving prompt order."""
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
- value = match.group(1)
226
- if value.startswith("file:"):
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
- continue
234
- if item not in seen:
235
- seen.add(item)
236
- result.append(item)
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 = parse_chatbook_mentions(prompt)
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
- for kind, relative in mentions:
260
- token = f"@{kind}:{relative}"
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
- try:
306
- path = _safe_relative_path(relative, skipped_directories)
307
- display = _relative_display(path, root)
308
- if kind == "file":
309
- content = _read_text_file(path)
310
- else:
311
- content = _list_directory(path)
312
- resolved.append(
313
- {
314
- "token": token,
315
- "kind": kind,
316
- "path": display,
317
- "content": content,
318
- "available": "true",
319
- }
320
- )
321
- except (OSError, RuntimeError, UnicodeError, ValueError):
322
- resolved.append(
323
- {
324
- "token": token,
325
- "kind": kind,
326
- "path": relative,
327
- "content": "[unavailable]",
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
 
@@ -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.0.0-a3",
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.342cef7bc2948099c0d0.js",
179
+ "load": "static/remoteEntry.10c9ca7e4b3cffb98413.js",
180
180
  "extension": "./extension",
181
181
  "style": "./style"
182
182
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plmbr/notebook-intelligence",
3
- "version": "6.0.0-a3",
3
+ "version": "6.2.0",
4
4
  "description": "AI coding assistant for JupyterLab",
5
5
  "keywords": [
6
6
  "AI",