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