notebook-intelligence 6.0.0a2__tar.gz → 6.0.0a3__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 (308) hide show
  1. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/CHANGELOG.md +40 -5
  2. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/CONTRIBUTING.md +7 -2
  3. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/PKG-INFO +32 -12
  4. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/PRIVACY.md +23 -21
  5. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/README.md +23 -4
  6. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/RELEASE.md +11 -2
  7. notebook_intelligence-6.0.0a3/SECURITY.md +53 -0
  8. notebook_intelligence-6.0.0a3/docs/acp.md +34 -0
  9. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/docs/admin-guide.md +13 -2
  10. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/docs/admin-tour-config.md +1 -1
  11. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/docs/chatbook-extensions.md +1 -1
  12. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/docs/chatbook.md +40 -4
  13. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/docs/performance-diagnostics.md +5 -1
  14. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/docs/rulesets.md +2 -2
  15. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/docs/troubleshooting.md +12 -0
  16. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/_version.py +1 -1
  17. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/ai_service_manager.py +41 -1
  18. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_generate.py +147 -7
  19. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/codegen.py +34 -0
  20. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/github_copilot.py +24 -2
  21. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/package.json +10 -2
  22. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/package.json.orig +9 -1
  23. notebook_intelligence-6.0.0a2/notebook_intelligence/labextension/static/326.73035788381458a47018.js → notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js +2 -2
  24. notebook_intelligence-6.0.0a2/notebook_intelligence/labextension/static/701.3d1d9c73116dbb5face8.js → notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/701.98cf201a781644814727.js +1 -1
  25. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/editor.worker.js +1 -1
  26. notebook_intelligence-6.0.0a2/notebook_intelligence/labextension/static/remoteEntry.e915e95430f82b5f99f1.js → notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/remoteEntry.342cef7bc2948099c0d0.js +1 -1
  27. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/mcp_client.py +13 -12
  28. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/package.json +9 -1
  29. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/pyproject.toml +65 -38
  30. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_chatbook.py +154 -0
  31. notebook_intelligence-6.0.0a3/tests/test_chatbook_perf.py +124 -0
  32. notebook_intelligence-6.0.0a3/tests/test_github_copilot_login_gating.py +231 -0
  33. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/README.md +13 -8
  34. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/yarn.lock +37 -82
  35. notebook_intelligence-6.0.0a2/SECURITY.md +0 -43
  36. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.copier-answers.yml +0 -0
  37. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.editorconfig +0 -0
  38. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.gitignore +0 -0
  39. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/.gitignore +0 -0
  40. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/applypatch-msg +0 -0
  41. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/commit-msg +0 -0
  42. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/h +0 -0
  43. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/husky.sh +0 -0
  44. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/post-applypatch +0 -0
  45. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/post-checkout +0 -0
  46. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/post-commit +0 -0
  47. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/post-merge +0 -0
  48. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/post-rewrite +0 -0
  49. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/pre-applypatch +0 -0
  50. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/pre-auto-gc +0 -0
  51. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/pre-commit +0 -0
  52. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/pre-merge-commit +0 -0
  53. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/pre-push +0 -0
  54. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/pre-rebase +0 -0
  55. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/_/prepare-commit-msg +0 -0
  56. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.husky/pre-commit +0 -0
  57. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.prettierignore +0 -0
  58. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.vscode/extensions.json +0 -0
  59. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.vscode/settings.json +0 -0
  60. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/.yarnrc.yml +0 -0
  61. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/AGENTS.md +0 -0
  62. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/CLAUDE.md +0 -0
  63. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/LICENSE +0 -0
  64. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/benchmarks/claude_perf/README.md +0 -0
  65. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
  66. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/benchmarks/claude_perf/bench_runner.py +0 -0
  67. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/benchmarks/claude_perf/bench_terminal.py +0 -0
  68. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/benchmarks/claude_perf/prompts.py +0 -0
  69. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/benchmarks/claude_perf/report.py +0 -0
  70. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/benchmarks/claude_perf/stats.py +0 -0
  71. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/docs/skills.md +0 -0
  72. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/install.json +0 -0
  73. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/jest.config.js +0 -0
  74. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/jupyter-config/server-config/notebook_intelligence.json +0 -0
  75. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/__init__.py +0 -0
  76. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/_claude_cli.py +0 -0
  77. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/acp_agent.py +0 -0
  78. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/acp_mcp_server.py +0 -0
  79. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/acp_registry.py +0 -0
  80. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/api.py +0 -0
  81. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/base_chat_participant.py +0 -0
  82. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/built_in_toolsets.py +0 -0
  83. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/cell_output.py +0 -0
  84. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chat_history_budget.py +0 -0
  85. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/__init__.py +0 -0
  86. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/__main__.py +0 -0
  87. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/backend.py +0 -0
  88. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/danger.py +0 -0
  89. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/execution.py +0 -0
  90. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/kernel.py +0 -0
  91. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/kernelspec/kernel.json +0 -0
  92. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/kernelspec/logo-svg.svg +0 -0
  93. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_kernel/nbi_client.py +0 -0
  94. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/chatbook_mentions.py +0 -0
  95. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/checks.py +0 -0
  96. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/claude.py +0 -0
  97. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/claude_mcp_manager.py +0 -0
  98. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/claude_sessions.py +0 -0
  99. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/config.py +0 -0
  100. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/context_factory.py +0 -0
  101. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/extension.py +0 -0
  102. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/feature_flags.py +0 -0
  103. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
  104. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/inline_completion.py +0 -0
  105. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +0 -0
  106. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/156.7e517ead254858a9eb50.js +0 -0
  107. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/196.ae4c84cd4812d9d7cbcf.js +0 -0
  108. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
  109. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/24c0eed6cf7014abfb18.module.wasm +0 -0
  110. /notebook_intelligence-6.0.0a2/notebook_intelligence/labextension/static/326.73035788381458a47018.js.LICENSE.txt → /notebook_intelligence-6.0.0a3/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js.LICENSE.txt +0 -0
  111. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/537.e250b395dd56252f433b.js +0 -0
  112. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/631.c3b7a19d8e9bb293fff8.js +0 -0
  113. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js +0 -0
  114. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js.LICENSE.txt +0 -0
  115. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/671.dd4f3f162a9464547691.js +0 -0
  116. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/694.97c3499ce07ad99e125a.js +0 -0
  117. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/728.7f069be896fa3f595701.js +0 -0
  118. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/768.7edd3110b64beb9041b7.js +0 -0
  119. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/938a2c885cbaa713e543.module.wasm +0 -0
  120. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/976.7dffd54c5614c4e8083f.js +0 -0
  121. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
  122. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/style.js +0 -0
  123. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/labextension/static/third-party-licenses.json +0 -0
  124. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
  125. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
  126. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
  127. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
  128. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/mcp_config_validation.py +0 -0
  129. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/mcp_manager.py +0 -0
  130. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/mcp_policy.py +0 -0
  131. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/mcp_ui_proxy.py +0 -0
  132. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/perf.py +0 -0
  133. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/perf_probe.py +0 -0
  134. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/plugin_manager.py +0 -0
  135. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/prompts.py +0 -0
  136. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/readiness.py +0 -0
  137. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/rule_injector.py +0 -0
  138. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/rule_manager.py +0 -0
  139. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/ruleset.py +0 -0
  140. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/skill_github_import.py +0 -0
  141. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/skill_manager.py +0 -0
  142. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/skill_manifest.py +0 -0
  143. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/skill_reconciler.py +0 -0
  144. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/skillset.py +0 -0
  145. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/tour_config.py +0 -0
  146. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/notebook_intelligence/util.py +0 -0
  147. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/schema/plugin.json +0 -0
  148. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/setup.py +0 -0
  149. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/conftest.py +0 -0
  150. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/fixtures/rules/01-test-global.md +0 -0
  151. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/fixtures/rules/02-test-security.md +0 -0
  152. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/fixtures/rules/03-invalid-rule.md +0 -0
  153. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
  154. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
  155. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
  156. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_acp_agent.py +0 -0
  157. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_ai_service_manager_dispatch.py +0 -0
  158. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_ai_service_manager_integration.py +0 -0
  159. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_api_hygiene.py +0 -0
  160. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_base_chat_participant_integration.py +0 -0
  161. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_builtin_cell_output.py +0 -0
  162. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_builtin_file_read.py +0 -0
  163. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_builtin_search_files_sandbox.py +0 -0
  164. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
  165. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_cell_output.py +0 -0
  166. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_cell_output_features_response.py +0 -0
  167. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_chat_history_budget.py +0 -0
  168. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_chatbook_backend.py +0 -0
  169. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_chatbook_danger.py +0 -0
  170. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_chatbook_enable.py +0 -0
  171. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_bash_approval_rendering.py +0 -0
  172. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_client.py +0 -0
  173. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_mcp_manager.py +0 -0
  174. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_models.py +0 -0
  175. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_sdk_mcp_server.py +0 -0
  176. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_sessions.py +0 -0
  177. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_sessions_handler.py +0 -0
  178. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_system_prompt.py +0 -0
  179. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_tool_humanizer.py +0 -0
  180. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_tool_path_sandbox.py +0 -0
  181. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_tool_results.py +0 -0
  182. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_claude_turn_usage.py +0 -0
  183. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_coding_agent_launchers.py +0 -0
  184. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_config_atomic_save.py +0 -0
  185. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_config_handler_claude_settings.py +0 -0
  186. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_config_integration.py +0 -0
  187. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_context_factory.py +0 -0
  188. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_default_password_refusal.py +0 -0
  189. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_disabled_provider_models.py +0 -0
  190. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_enabled_providers_env.py +0 -0
  191. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_end_to_end_rule_integration.py +0 -0
  192. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_feature_flags.py +0 -0
  193. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_feedback.py +0 -0
  194. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_file_upload.py +0 -0
  195. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_github_copilot_llm_provider.py +0 -0
  196. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_github_copilot_user_data_mode.py +0 -0
  197. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_image_context.py +0 -0
  198. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_inline_completion_shortcuts.py +0 -0
  199. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_lazy_provider_imports.py +0 -0
  200. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_litellm_compatible_llm_provider.py +0 -0
  201. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_mcp_client_shim.py +0 -0
  202. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_mcp_config_validation.py +0 -0
  203. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_mcp_manager.py +0 -0
  204. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_mcp_manager_command_allowlist.py +0 -0
  205. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_mcp_null_config.py +0 -0
  206. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_mcp_policy.py +0 -0
  207. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_models.py +0 -0
  208. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_openai_compatible_llm_provider.py +0 -0
  209. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_perf.py +0 -0
  210. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_perf_instrumentation.py +0 -0
  211. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_perf_probe.py +0 -0
  212. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_permission_modes.py +0 -0
  213. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_plugin_manager.py +0 -0
  214. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_policy_gate.py +0 -0
  215. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_process_tree_teardown.py +0 -0
  216. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_provider_stream_cancellation.py +0 -0
  217. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_readiness.py +0 -0
  218. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_redact_process_secrets.py +0 -0
  219. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_response_emitter.py +0 -0
  220. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_rule_auto_reload.py +0 -0
  221. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_rule_injector.py +0 -0
  222. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_rule_manager.py +0 -0
  223. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_run_ui_command_allowlist_parity.py +0 -0
  224. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_safe_anchor_uri.py +0 -0
  225. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_skill_fetch_redirects.py +0 -0
  226. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_skill_github_import.py +0 -0
  227. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_skill_manager.py +0 -0
  228. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_skill_manifest.py +0 -0
  229. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_skill_reconciler.py +0 -0
  230. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_skills_handlers.py +0 -0
  231. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_tour_config.py +0 -0
  232. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_user_input_wait.py +0 -0
  233. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_websocket_handler_integration.py +0 -0
  234. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_ws_callback_handler_leak.py +0 -0
  235. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/test_ws_handler_auth.py +0 -0
  236. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/__mocks__/jupyterlab-apputils.ts +0 -0
  237. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
  238. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/__mocks__/strip-ansi.ts +0 -0
  239. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/__mocks__/svg.ts +0 -0
  240. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/__mocks__/tiktoken.ts +0 -0
  241. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/ask-user-question.test.tsx +0 -0
  242. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/cell-output-bundle.test.ts +0 -0
  243. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/cell-output-features.test.ts +0 -0
  244. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/cell-output-toolbar.test.ts +0 -0
  245. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/chat-cancel.test.ts +0 -0
  246. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/chat-prefix-suggestions.test.ts +0 -0
  247. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/chat-progress-feedback.test.ts +0 -0
  248. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/chat-stopped-turn.test.ts +0 -0
  249. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/chat-transcript.test.ts +0 -0
  250. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/chatbook-execute.test.ts +0 -0
  251. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/chatbook-mentions-menu.test.ts +0 -0
  252. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/chatbook-mentions.test.ts +0 -0
  253. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/chatbook.test.ts +0 -0
  254. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/checkbox.test.tsx +0 -0
  255. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/choose-workspace-directory.test.ts +0 -0
  256. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/claude-mcp-paste.test.ts +0 -0
  257. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/coding-agent-launchers.test.ts +0 -0
  258. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/confirmation-details.test.tsx +0 -0
  259. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/inline-completer-telemetry.test.ts +0 -0
  260. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/inline-completion-origin.test.ts +0 -0
  261. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/inline-completion-request.test.ts +0 -0
  262. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/launcher-picker.test.tsx +0 -0
  263. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/markdown-code-class.test.ts +0 -0
  264. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/markdown-renderer.test.tsx +0 -0
  265. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/mcp-config-save.test.ts +0 -0
  266. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/mcp-config-temp-file.test.ts +0 -0
  267. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/mcp-util.test.ts +0 -0
  268. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/notebook-generation.test.ts +0 -0
  269. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/open-file-refresh-watcher.test.ts +0 -0
  270. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/perf-panel.test.tsx +0 -0
  271. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/permission-mode-select.test.tsx +0 -0
  272. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/plugins-panel.test.tsx +0 -0
  273. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/readiness-card.test.tsx +0 -0
  274. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/response-stream-command-allowlist.test.ts +0 -0
  275. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/safe-anchor.test.tsx +0 -0
  276. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/settings-property-field.test.tsx +0 -0
  277. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/settings-required-property.test.ts +0 -0
  278. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/settings-tab-name.test.tsx +0 -0
  279. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/setup.ts +0 -0
  280. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/skill-wire-format.test.ts +0 -0
  281. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/task-target-notebook.test.ts +0 -0
  282. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/terminal-drag.test.ts +0 -0
  283. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/tool-call-card.test.tsx +0 -0
  284. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/tool-call-group.test.tsx +0 -0
  285. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/tool-call-stream.test.ts +0 -0
  286. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/tour-config.test.ts +0 -0
  287. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/tour-events.test.ts +0 -0
  288. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/tour-overlay.test.tsx +0 -0
  289. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/tour-state.test.ts +0 -0
  290. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/tsconfig.json +0 -0
  291. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/utils.test.ts +0 -0
  292. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tests/ts/workspace-skips.test.ts +0 -0
  293. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/tsconfig.json +0 -0
  294. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/.eslintrc.js +0 -0
  295. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/jupyter_server_test_config.py +0 -0
  296. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/package.json +0 -0
  297. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/playwright.config.ts +0 -0
  298. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/tests/cell-output.spec.ts +0 -0
  299. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
  300. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/tests/chatbook-cell-mode-badge.spec.ts +0 -0
  301. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
  302. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/tests/extension.spec.ts +0 -0
  303. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/tests/helpers.ts +0 -0
  304. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/tests/launcher.spec.ts +0 -0
  305. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
  306. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/tsconfig.json +0 -0
  307. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/ui-tests/yarn.lock +0 -0
  308. {notebook_intelligence-6.0.0a2 → notebook_intelligence-6.0.0a3}/webpack.config.js +0 -0
@@ -8,13 +8,42 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
8
8
 
9
9
  <!-- <START NEW CHANGELOG ENTRY> -->
10
10
 
11
- ## [5.4.1] - unreleased
11
+ ## [6.0.0] - unreleased
12
12
 
13
- ### Fixed
13
+ 6.0.0 adds Chatbook, a notebook whose cells can be written in English and executed as generated code, together with its admin policy, its own kernel, and the context, mention, and ruleset plumbing around it. The rest of the release is hardening: the experimental ACP agent mode gets a tighter sandbox and better approval cards, and a long tail of chat, settings, MCP, and readiness fixes. The major version marks Chatbook's arrival rather than a compatibility break: no traitlet, env var, REST route, command id, or on-disk format was renamed or removed, `requires-python` is unchanged at `>=3.10`, and the supported JupyterLab range widened rather than narrowed. Upgrading needs no migration.
14
+
15
+ ### Added
16
+
17
+ - **Chatbook: notebooks whose cells are written in English** (#406, #448, #480). A Chatbook is an ordinary `.ipynb` opened against a new `chatbook` kernel, in which each cell is either a natural-language prompt (**NL**) or ordinary code (**Cd**). Running an NL cell generates code for the notebook's backend kernel and runs it; the cell badge is a button and `Ctrl J` / `Ctrl Shift J` switch the active cell or every cell between the two modes. Generated code is governed by an execution mode: `always-confirm` (the default) shows the code and waits, `confirm-if-risky` waits only when a scan finds destructive filesystem, shell, or process calls, and `auto-run` executes without asking. `NBI_CHATBOOK_POLICY` gates the whole feature the way every other admin policy does, and `NBI_CHATBOOK_MAX_EXECUTION_MODE` caps how permissive a user may be, so a tenant can pin `always-confirm` and remove the rest from the dropdown. The backend kernel is resolved from the notebook rather than assumed, so Chatbook is not Python-only, and rules under `modes/chatbook/` apply to generation. Cells can pull context with `@` mentions, served by built-in providers and by any that an extension registers (see [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md)); a Chatbook can be exported to a plain code notebook for the backend language. Running a **Cd** cell also asks the model for an English description of that code, stored in cell metadata, so a hand-written cell can be read as prose later. Chatbook ships a kernelspec and one new route, `POST /notebook-intelligence/chatbook/generate`; `ipykernel` is now a runtime dependency. See [`docs/chatbook.md`](docs/chatbook.md).
18
+ - **The MCP handshake is bounded** (#456). A `mcp.json` entry pointing at a command that is not an MCP server never answered the protocol handshake, and the connect attempt could occupy the backend indefinitely. Connect and disconnect now run under deadlines, `NBI_MCP_CONNECT_TIMEOUT` (60 seconds by default) and `NBI_MCP_DISCONNECT_TIMEOUT`, after which the server is marked failed and the log says the command may not be an MCP server. A command that writes non-JSON output in a loop would otherwise fill the log with one parse error per line, so those records are capped and the number withheld is reported with the failure.
14
19
 
15
- - **Saving Claude settings keeps keys the tab does not show.** The Claude settings tab saves the keys it renders when it opens, and the server stored that object in place of the old one. Any other `claude_settings` key was erased, including `jupyter_ui_tools_external` (#398), which is set by hand in `config.json`. `POST /notebook-intelligence/config` now merges a posted `claude_settings` onto the stored value. Settings saves also re-read `config.json` first, so a hand edit made while JupyterLab runs is no longer overwritten when a settings tab next saves.
20
+ ### Changed
21
+
22
+ - **Tab accepts an inline suggestion only when one is on screen** (#444). The accept binding was scoped to `.jp-mod-completer-enabled`, which is set whenever the completer is active, so Tab could be swallowed in an edit-mode cell with nothing to accept instead of indenting. It is now scoped to `.jp-mod-inline-completer-active`. Inline completion responses are also identified per request, so a reply that arrives after its request was superseded is discarded rather than accepted.
23
+ - **Ollama's chat-model list is fetched lazily and bounded** (#427). Enumerating models ran at startup and waited on the Ollama host, so a configured but unreachable host delayed the extension. The enumeration is deferred and time-bounded, and a failure logs a warning instead of holding up load.
24
+ - **A disabled provider no longer advertises its models** (#431). `disabled_providers` removed a provider from the picker but the capabilities response still carried its model list, so a disabled provider's models remained selectable through a stale or hand-edited config.
25
+ - **Dependency floors and build pins** (#422, #445). `@jupyterlab/launcher` widened from `~4.2.0` to `^4.0.0`, which stops JupyterLab 4.6 flagging the dependency. `fast-uri` and `js-yaml` resolutions were raised past HIGH-severity advisories. The build pins `hatchling<1.32`: 1.32 made `BuildHookInterface` generic over two type parameters, and `hatch-jupyter-builder` subclasses it with one, so sdist and wheel builds failed with `TypeError: Too few arguments`. A later audit (#492) raised six Python floors that still named a release carrying a published advisory (`jupyter_server` to 2.21.0, `cryptography` to 50.0.0, `litellm` to 1.84.0, `mistune` to 3.3.3, `python-multipart` to 0.0.31, `aiohttp` to 3.14.3), added the `python-dotenv>=1.2.2` floor that litellm's old `==1.0.1` hard pin had blocked, moved the `pytest` test extra to `>=9.0.3`, and added npm resolutions for `browserslist`, `baseline-browser-mapping`, `colord`, and `postcss-selector-parser`. Those four are build and lint tooling and do not reach the shipped bundle.
26
+
27
+ ### Fixed
16
28
 
17
- ## [5.4.0] - unreleased
29
+ - **A forged approval prompt can no longer impersonate the real one** (#415). Command text rendered into a Claude Bash approval card could close the displayed block and add its own trailing content, so what the card showed and what would run could differ. Command text is now fenced with a collision-resistant delimiter and bidirectional control characters are rejected. ACP approval cards apply the same policy.
30
+ - **Backend-requested UI commands are gated behind an allowlist** (#443). The response stream could ask the frontend to execute a JupyterLab command by id, with no restriction on which. Requests are now checked against an allowlist at a single chokepoint. `run-command-in-terminal` remains allowlisted, so shell reachability is unchanged; the change removes the ability to reach arbitrary commands.
31
+ - **ACP agents are no longer served the client's filesystem or terminal** (#418, #419, #423, #424). NBI refused some agent requests and honored others, which let an agent borrow the Jupyter server process's reach. Filesystem reads and writes, terminal methods, and agent extension requests are now refused at the router, so the agent does its own I/O under its own sandbox. Full access, when an admin allows it, grants workspace writes rather than unrestricted access. Approval cards show the command and the reason the agent gave, rendered as separate labeled blocks so a long detail cannot hide the command. An NBI-supplied API key no longer spreads through Codex's own configuration, and the cleanup of previously written credentials states its limits rather than implying it is complete.
32
+ - **The ACP session picker shows something useful** (#421). Session titles were cut inside a context pointer, and previews carried pointer segments that meant nothing to a reader; titles are now cut on a boundary and pointer segments are stripped. Session files are named relative to the open directory.
33
+ - **Saving Claude settings keeps keys the tab does not show** (#420). The Claude settings tab saves the keys it renders when it opens, and the server stored that object in place of the old one. Any other `claude_settings` key was erased, including `jupyter_ui_tools_external` (#398), which is set by hand in `config.json`. `POST /notebook-intelligence/config` now merges a posted `claude_settings` onto the stored value. Settings saves also re-read `config.json` first, so a hand edit made while JupyterLab runs is no longer overwritten when a settings tab next saves. Settings changes are judged against the running state rather than the state the tab opened with.
34
+ - **Readiness reports a blank required model instead of answering Ready** (#459). An OpenAI-compatible or LiteLLM-compatible provider with the **Model** field left empty persisted as an empty string. Readiness answered "Ready. Nothing needs configuring" while every chat turn went out with no model name and failed. A blank required property is now a blocking row naming the field, and the settings form marks it once touched.
35
+ - **The performance report names the provider that served a turn** (#461). Turns were labeled from the resolved model, which reported `copilot` for every Claude-mode turn and mislabeled a Copilot user pinned outside the fallback list. The label now comes from the configured provider, and a malformed config no longer raises on the chat path.
36
+ - **A stopped response says so in the transcript** (#474, #477, #478, #479). Stopping a response left the bubble exactly as it was, indistinguishable from a model that returned nothing. The turn is now marked, and the marker survives both later deltas and a second turn streaming alongside it. Stop also reaches every turn that is running, not only the one the sidebar input started, so a response begun from an editor command can be stopped; and the openai-compatible, LiteLLM-compatible, and Ollama chat models now read the cancel token and close the stream, so a stopped turn stops generating at the provider instead of running to completion.
37
+ - **Concurrent turns no longer erase each other from the transcript** (#478). A streaming turn rewrote the whole transcript from a snapshot taken when it started, so a turn begun from an editor command while a sidebar response streamed removed that response and its prompt. Each turn now updates only its own message, and a response is placed next to the prompt it answers.
38
+ - **Enter sends a message that starts with an unmatched `@` or `/`** (#464). Typing a prefix that matched no completion left the suggestion popover open with nothing selected, and Enter raised rather than sending; the message could not be sent at all without editing it.
39
+ - **The MCP config editor reports a JSON syntax error** (#470) and **no longer deletes a temp file it has not created** (#460). Saving malformed JSON parsed the document outside the error handling, so the edit was dropped with no message anywhere but the devtools console while the tab looked saved. Opening the editor also deleted its temp file first, which answered 404 on every open because the file is normally absent.
40
+ - **A malformed `mcp.json` no longer takes down MCP support** (#433). A bad `mcpServers` or `participants` section raised during parsing; the malformed section is now skipped with a log line and the rest of the file is honored.
41
+ - **`NBI_ENABLED_PROVIDERS` is parsed as a CSV list** (#435). It was read as a single value, so an admin re-enabling more than one provider re-enabled none of them.
42
+ - **Open files are reverted more carefully** (#429). A file changed on disk was reverted even while its kernel was running, which could swap the source out from under an executing cell; the revert is now skipped while the kernel is busy and announced when it happens. The reload notice is scoped to the visible document instead of firing for background files.
43
+ - **Chatbook fixes** (#457, #458). The mention menu could outlive the cell that opened it and reappear over an unrelated cell. Cells whose generated code never ran no longer take an execution number, so a cell waiting on the confirm bar does not look like it executed.
44
+ - **Settings panel layout and labels** (#462, #471, #472). The content pane collapsed to nothing in a narrow window while the tab column kept its full width. Buttons pairing an icon with a label rendered the label outside the button, where it painted over the panel background and became invisible. Decorative tab icons are hidden from the accessibility tree.
45
+
46
+ ## [5.4.0] - 2026-09-01
18
47
 
19
48
  5.4.0 adds a second agent mode (ACP, with Codex as the first agent type) alongside Claude mode, a way to serve NBI's Jupyter-UI tools to an agent running outside the Lab page, and two diagnostic surfaces for deployments where something is misconfigured or slow: a configuration readiness preflight that names the missing piece, and opt-in performance diagnostics with per-turn timelines. ACP mode, performance diagnostics, and the tool proxy are opt-in and default to off; the readiness preflight's non-billing checks run when Settings opens, and its live endpoint test is opt-in. No traitlet, env-var, REST route, or on-disk-format renames or removals.
20
49
 
@@ -467,7 +496,13 @@ A multi-PR accessibility pass landed across most NBI surfaces. Together these ma
467
496
  - Settings UI restructured around Claude vs default mode.
468
497
  - WebSocket connection reliability improvements.
469
498
 
470
- [unreleased]: https://github.com/plmbr/notebook-intelligence/compare/v5.1.0...HEAD
499
+ [unreleased]: https://github.com/plmbr/notebook-intelligence/compare/v6.0.0...HEAD
500
+ [6.0.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.4.0...v6.0.0
501
+ [5.4.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.3.1...v5.4.0
502
+ [5.3.1]: https://github.com/plmbr/notebook-intelligence/compare/v5.3.0...v5.3.1
503
+ [5.3.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.2.1...v5.3.0
504
+ [5.2.1]: https://github.com/plmbr/notebook-intelligence/compare/v5.2.0...v5.2.1
505
+ [5.2.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.1.0...v5.2.0
471
506
  [5.1.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.0.1...v5.1.0
472
507
  [5.0.1]: https://github.com/plmbr/notebook-intelligence/compare/v5.0.0...v5.0.1
473
508
  [5.0.0]: https://github.com/plmbr/notebook-intelligence/compare/v4.8.0...v5.0.0
@@ -37,6 +37,9 @@ NBI has two halves:
37
37
  - `notebook_intelligence/rule_manager.py`, `rule_injector.py`, `ruleset.py` — ruleset discovery and prompt injection.
38
38
  - `notebook_intelligence/built_in_toolsets.py` — built-in tool implementations (`nbi-notebook-edit`, `nbi-command-execute`, etc.).
39
39
  - `notebook_intelligence/github_copilot.py` — GitHub Copilot device-flow auth and token storage.
40
+ - `notebook_intelligence/chatbook_kernel/` — the Chatbook kernel: `kernel.py` (the wrapper that proxies to a backend kernelspec), `codegen.py`, `execution.py` (execution modes), `danger.py` (the risk scan), and the shipped kernelspec.
41
+ - `notebook_intelligence/chatbook_generate.py` — the generate, summarize, and danger-scan endpoint behind Chatbook cells.
42
+ - `notebook_intelligence/acp_agent.py`, `acp_registry.py` — ACP agent mode: the protocol client, what NBI serves or refuses an agent, and adapter launch.
40
43
  - **Frontend extension** — TypeScript package `src/`. Compiled to a JupyterLab labextension. Key entry points:
41
44
  - `src/index.ts` — JupyterLab plugin registration.
42
45
  - `src/chat-sidebar.tsx` — chat sidebar React tree.
@@ -44,6 +47,7 @@ NBI has two halves:
44
47
  - `src/components/skills-panel.tsx` — Claude Skills management UI.
45
48
  - `src/api.ts` — high-level client for the server extension (chat WebSocket, capabilities, config).
46
49
  - `src/handler.ts` — thin wrapper over Jupyter's `ServerConnection.makeRequest`.
50
+ - `src/chatbook.ts`, `src/chatbook-core.ts` — Chatbook cell behavior: mode switching, the confirm bar, export, and the cell metadata format.
47
51
 
48
52
  The two halves communicate over the routes registered in `extension.py` (REST and WebSocket). All routes live under `/notebook-intelligence/`. See [`docs/admin-guide.md`](docs/admin-guide.md#http-api-surface) for the full list.
49
53
 
@@ -159,9 +163,10 @@ The `jupyter labextension develop` command leaves a symlink behind. Run `jupyter
159
163
 
160
164
  ## Running tests
161
165
 
162
- TypeScript unit tests:
166
+ TypeScript type check and unit tests:
163
167
 
164
168
  ```bash
169
+ jlpm tsc --noEmit
165
170
  jlpm test
166
171
  ```
167
172
 
@@ -172,7 +177,7 @@ pip install -e ".[test]"
172
177
  pytest tests/ -q
173
178
  ```
174
179
 
175
- CI runs both suites on every push, in that order. Every test is capped at 30 seconds by `pytest-timeout`, so a hung subprocess or pipe fails the run instead of stalling the job.
180
+ CI runs both suites on every push, Python first, then TypeScript. Every test is capped at 30 seconds by `pytest-timeout`, so a hung subprocess or pipe fails the run instead of stalling the job.
176
181
 
177
182
  ## Linting
178
183
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: notebook_intelligence
3
- Version: 6.0.0a2
3
+ Version: 6.0.0a3
4
4
  Summary: AI coding assistant for JupyterLab
5
5
  Project-URL: Homepage, https://github.com/plmbr/notebook-intelligence
6
6
  Project-URL: Bug Tracker, https://github.com/plmbr/notebook-intelligence/issues
@@ -695,21 +695,22 @@ Classifier: Programming Language :: Python :: 3.11
695
695
  Classifier: Programming Language :: Python :: 3.12
696
696
  Requires-Python: >=3.10
697
697
  Requires-Dist: agent-client-protocol==0.10.1
698
- Requires-Dist: aiohttp>=3.14.1
698
+ Requires-Dist: aiohttp>=3.14.3
699
699
  Requires-Dist: anthropic>=0.22.1
700
700
  Requires-Dist: claude-agent-sdk
701
- Requires-Dist: cryptography>=48.0.1
701
+ Requires-Dist: cryptography>=50.0.0
702
702
  Requires-Dist: fuzy-jon==0.1.0
703
703
  Requires-Dist: ipykernel>=6.0
704
- Requires-Dist: jupyter-server<3,>=2.20.0
705
- Requires-Dist: litellm>=1.83.7
704
+ Requires-Dist: jupyter-server<3,>=2.21.0
705
+ Requires-Dist: litellm>=1.84.0
706
706
  Requires-Dist: mcp<2,>=1.28.1
707
- Requires-Dist: mistune>=3.3.0
707
+ Requires-Dist: mistune>=3.3.3
708
708
  Requires-Dist: ollama
709
709
  Requires-Dist: openai
710
710
  Requires-Dist: psutil>=5.7
711
711
  Requires-Dist: pydantic-settings>=2.14.2
712
- Requires-Dist: python-multipart>=0.0.27
712
+ Requires-Dist: python-dotenv>=1.2.2
713
+ Requires-Dist: python-multipart>=0.0.31
713
714
  Requires-Dist: sseclient-py
714
715
  Requires-Dist: starlette>=1.3.1
715
716
  Requires-Dist: tiktoken
@@ -718,7 +719,7 @@ Requires-Dist: urllib3>=2.7.0
718
719
  Provides-Extra: test
719
720
  Requires-Dist: psutil; extra == 'test'
720
721
  Requires-Dist: pytest-timeout>=2.3.0; extra == 'test'
721
- Requires-Dist: pytest<9,>=7.0; extra == 'test'
722
+ Requires-Dist: pytest<10,>=9.0.3; extra == 'test'
722
723
  Requires-Dist: pyyaml; extra == 'test'
723
724
  Description-Content-Type: text/markdown
724
725
 
@@ -736,6 +737,8 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
736
737
  - [Feature highlights](#feature-highlights)
737
738
  - [Claude mode](#claude-mode)
738
739
  - [Agent mode](#agent-mode)
740
+ - [ACP agent mode](#acp-agent-mode)
741
+ - [Chatbook](#chatbook)
739
742
  - [Code generation with inline chat](#code-generation-with-inline-chat)
740
743
  - [Auto-complete](#auto-complete)
741
744
  - [Chat interface](#chat-interface)
@@ -765,7 +768,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
765
768
 
766
769
  - Python 3.10+
767
770
  - JupyterLab 4.x
768
- - Node.js — only required for [Claude mode](#claude-mode) (the Claude Code CLI) and for MCP servers that launch via `npx`.
771
+ - Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for [ACP agent mode](#acp-agent-mode), which launches its adapter with `npx` on every start, and for MCP servers that launch via `npx`.
769
772
  - A fresh virtualenv or conda env is recommended so NBI doesn't conflict with system Python.
770
773
 
771
774
  ## Quick start
@@ -874,6 +877,20 @@ In Agent mode, the built-in AI agent creates, edits, and executes notebooks for
874
877
 
875
878
  ![Agent mode](media/agent-mode.gif)
876
879
 
880
+ ### ACP agent mode
881
+
882
+ An experimental second agent mode that drives an external coding agent over the [Agent Client Protocol](https://agentclientprotocol.com/), with OpenAI Codex as the only agent type today. The agent runs as a subprocess and does its own file and command work, asking for approval through NBI's confirmation cards; NBI deliberately does not lend it the Jupyter server's filesystem or terminal.
883
+
884
+ It is off by default and the Settings tab stays hidden until an admin allows the mode, and it cannot be used at the same time as Claude mode. See [`docs/acp.md`](docs/acp.md).
885
+
886
+ ### Chatbook
887
+
888
+ A Chatbook is a notebook whose cells can be written in English. Running a prompt cell generates code for the notebook's backend kernel and runs it; each cell carries a badge showing whether it is a prompt (**NL**) or ordinary code (**Cd**), and `Ctrl J` switches between them.
889
+
890
+ What happens to generated code before it runs is yours to choose: **Always confirm** (the default) shows the code and waits, **Confirm if risky** waits only when a scan finds destructive calls, and **Auto-run** executes straight away. Admins can cap that choice fleet-wide, or turn Chatbook off entirely.
891
+
892
+ Prompts can pull in context with `@` mentions, rules apply to generation the same way they apply to chat, the backend kernel need not be Python, and a Chatbook exports to a plain code notebook when you want to hand someone the result instead of the prompts. See [`docs/chatbook.md`](docs/chatbook.md).
893
+
877
894
  ### Code generation with inline chat
878
895
 
879
896
  Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the inline chat popover.
@@ -884,7 +901,7 @@ Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the in
884
901
 
885
902
  ### Auto-complete
886
903
 
887
- Auto-complete suggestions are shown as you type. `Tab` accepts. NBI provides auto-complete in code cells and Python file editors.
904
+ Auto-complete suggestions are shown as you type. `Tab` accepts one while it is on screen, and indents otherwise. NBI provides auto-complete in code cells and Python file editors.
888
905
 
889
906
  <img src="media/inline-completion.gif" alt="Auto-complete" width=700 />
890
907
 
@@ -904,6 +921,8 @@ Right-click a cell output (or hover for the toolbar) to send it straight into th
904
921
 
905
922
  Each is per-user toggleable from Settings (saved as `enable_explain_error`, `enable_output_followup`, `enable_output_toolbar` in `config.json`, default on) and admin-lockable via `NBI_EXPLAIN_ERROR_POLICY` / `NBI_OUTPUT_FOLLOWUP_POLICY` / `NBI_OUTPUT_TOOLBAR_POLICY`.
906
923
 
924
+ A revert is skipped while that document's kernel is busy, so a change landing mid-execution is applied when the cell finishes rather than swapped in under it, and the notice naming the reloaded file is shown only for the document you are looking at.
925
+
907
926
  ### Notebook toolbar generation
908
927
 
909
928
  Active notebooks show a sparkle icon on the toolbar. Click it to open a popover that scopes the generation request to that specific notebook — handy for multi-notebook sessions where you don't want the chat sidebar to compete for context.
@@ -1210,7 +1229,8 @@ Full guide, including the span and event reference, the probe thresholds, worked
1210
1229
  - [`docs/admin-guide.md`](docs/admin-guide.md) — deployment, env vars, security model, air-gap, multi-tenancy.
1211
1230
  - [`docs/skills.md`](docs/skills.md) — Claude Skills management and the org-manifest reconciler.
1212
1231
  - [`docs/rulesets.md`](docs/rulesets.md) — ruleset frontmatter and discovery.
1213
- - [`docs/chatbook.md`](docs/chatbook.md) — Chatbook execution modes and why there is no per-cell sandbox.
1232
+ - [`docs/acp.md`](docs/acp.md) — using the experimental ACP agent mode, and its limits.
1233
+ - [`docs/chatbook.md`](docs/chatbook.md) — writing Chatbook cells, execution modes, export, and why there is no per-cell sandbox.
1214
1234
  - [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md) — dynamic Chatbook context and mention providers.
1215
1235
  - [`docs/troubleshooting.md`](docs/troubleshooting.md) — common problems with copy-pasteable fixes.
1216
1236
  - [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md): turn timelines, the environment probe, and how to read both.
@@ -1228,7 +1248,7 @@ Full guide, including the span and event reference, the probe thresholds, worked
1228
1248
 
1229
1249
  ## Roadmap
1230
1250
 
1231
- NBI 5.x is stable. New features land in minor releases (5.1, 5.2, …); breaking changes are reserved for the next major (6.x) and will be announced in the [changelog](CHANGELOG.md). Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
1251
+ NBI 6.x is the current line. New features land in minor releases (6.1, 6.2, …); breaking changes are reserved for a major release and announced in the [changelog](CHANGELOG.md). 6.0 itself is not a breaking release: it marks Chatbook's arrival, and no traitlet, env var, REST route, or on-disk format was renamed or removed, so upgrading from 5.x needs no migration. Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
1232
1252
 
1233
1253
  ## License
1234
1254
 
@@ -6,14 +6,15 @@ This page documents what NBI sends to external services, when, and how administr
6
6
 
7
7
  The table below describes what each LLM provider receives **when you actively use a feature** (chat message, inline completion, agent action). An idle JupyterLab does not contact the provider.
8
8
 
9
- | Provider | What is sent | When | Destination |
10
- | --------------------------------- | ------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------- |
11
- | **GitHub Copilot** | Prompt, surrounding cell source, attached files (when you click _attach_) | Per request (chat) and as you type (inline complete) | `api.githubcopilot.com`, `api.github.com` (auth) |
12
- | **OpenAI-compatible** | Prompt, surrounding cell source, attached files | Per request and per inline-completion request | The Base URL you configured (`api.openai.com` by default) |
13
- | **LiteLLM-compatible** | Same as OpenAI-compatible; the LiteLLM proxy forwards to the upstream model you configured | Per request | The Base URL of your LiteLLM proxy |
14
- | **Ollama (local)** | Prompt, surrounding cell source, attached files | Per request | Localhost (or the host you configured); **no external network** |
15
- | **Anthropic API** (Claude mode) | Prompt, surrounding cell source, attached files | Per inline-chat or auto-complete request | `api.anthropic.com` (or your configured Base URL) |
16
- | **Claude Code CLI** (Claude mode) | Prompt, working-directory file reads requested by Claude, shell-command output for tools Claude invokes | Per agent turn in the chat panel | Whatever the Claude Code CLI is configured to talk to (typically `api.anthropic.com`) |
9
+ | Provider | What is sent | When | Destination |
10
+ | --------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
11
+ | **GitHub Copilot** | Prompt, surrounding cell source, attached files (when you click _attach_) | Per request (chat) and as you type (inline complete) | `api.githubcopilot.com`, `api.github.com` (auth) |
12
+ | **OpenAI-compatible** | Prompt, surrounding cell source, attached files | Per request and per inline-completion request | The Base URL you configured (`api.openai.com` by default) |
13
+ | **LiteLLM-compatible** | Same as OpenAI-compatible; the LiteLLM proxy forwards to the upstream model you configured | Per request | The Base URL of your LiteLLM proxy |
14
+ | **Ollama (local)** | Prompt, surrounding cell source, attached files | Per request | Localhost (or the host you configured); **no external network** |
15
+ | **Anthropic API** (Claude mode) | Prompt, surrounding cell source, attached files | Per inline-chat or auto-complete request | `api.anthropic.com` (or your configured Base URL) |
16
+ | **Claude Code CLI** (Claude mode) | Prompt, working-directory file reads requested by Claude, shell-command output for tools Claude invokes | Per agent turn in the chat panel | Whatever the Claude Code CLI is configured to talk to (typically `api.anthropic.com`) |
17
+ | **ACP agent** (ACP mode) | Prompt and NBI's notebook context, plus whatever files the agent reads and command output it collects on its own | Per agent turn in the chat panel, and per Chatbook generation | Whatever the agent is configured to talk to (`api.openai.com` or your Base URL on the API-key path, or the agent's own signed-in backend) |
17
18
 
18
19
  ### Cell outputs are included when the cell is attached
19
20
 
@@ -28,19 +29,19 @@ If your cells contain sensitive outputs (PHI, PII, secrets), clear them before i
28
29
 
29
30
  Hosts NBI may contact, depending on which features are enabled:
30
31
 
31
- | Host | Purpose |
32
- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
33
- | `api.githubcopilot.com` | GitHub Copilot chat and inline completion |
34
- | `api.github.com` | GitHub Copilot device-flow login; managed-skills manifest fetches when hosted on github.com; skill imports |
35
- | `github.com`, `codeload.github.com` | Skill tarball downloads (Import from GitHub and the managed-skills reconciler) |
36
- | `raw.githubusercontent.com` | Manifest fetches when `NBI_SKILLS_MANIFEST` points at a `raw.githubusercontent.com` URL |
37
- | `api.anthropic.com` | Anthropic API for Claude-mode inline chat and auto-complete; also the default destination of the Claude Code CLI |
38
- | `api.openai.com` | OpenAI-compatible provider (default Base URL) |
39
- | Your configured Base URL | OpenAI-compatible, LiteLLM-compatible, or Claude when pointed at a self-hosted endpoint |
40
- | `localhost:11434` (or your Ollama host) | Ollama local model serving |
41
- | `registry.npmjs.org` and configured npm mirrors | Only if MCP servers are configured to launch via `npx -y` — `npx` fetches the package on first run |
32
+ | Host | Purpose |
33
+ | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
34
+ | `api.githubcopilot.com` | GitHub Copilot chat and inline completion |
35
+ | `api.github.com` | GitHub Copilot device-flow login; managed-skills manifest fetches when hosted on github.com; skill imports |
36
+ | `github.com`, `codeload.github.com` | Skill tarball downloads (Import from GitHub and the managed-skills reconciler) |
37
+ | `raw.githubusercontent.com` | Manifest fetches when `NBI_SKILLS_MANIFEST` points at a `raw.githubusercontent.com` URL |
38
+ | `api.anthropic.com` | Anthropic API for Claude-mode inline chat and auto-complete; also the default destination of the Claude Code CLI |
39
+ | `api.openai.com` | OpenAI-compatible provider (default Base URL) |
40
+ | Your configured Base URL | OpenAI-compatible, LiteLLM-compatible, or Claude when pointed at a self-hosted endpoint |
41
+ | `localhost:11434` (or your Ollama host) | Ollama local model serving |
42
+ | `registry.npmjs.org` and configured npm mirrors | MCP servers configured to launch via `npx -y`, and ACP mode, which launches its adapter with `npx` on every agent start unless `NBI_ACP_AGENT_COMMAND` points elsewhere |
42
43
 
43
- For the configurable destinations above (Base URLs, Ollama host, MCP `npx` packages), the destination is whatever you or your admin set. There is no other implicit network activity.
44
+ For the configurable destinations above (Base URLs, Ollama host, MCP `npx` packages), the destination is whatever you or your admin set. NBI itself starts no other network activity. In ACP mode the agent subprocess makes its own calls, which NBI neither proxies nor enumerates: the destinations there are the agent's to document, and blocking egress at the network layer is the only way to bound them from outside.
44
45
 
45
46
  For air-gapped or egress-restricted environments, see [`docs/admin-guide.md`](docs/admin-guide.md#air-gap-deployment).
46
47
 
@@ -55,6 +56,7 @@ For air-gapped or egress-restricted environments, see [`docs/admin-guide.md`](do
55
56
  | `~/.claude/skills/` | User-scope Claude skills |
56
57
  | `<project>/.claude/skills/` | Project-scope Claude skills |
57
58
  | `~/.claude/projects/` | Claude Code session transcripts (managed by Claude CLI, not NBI) |
59
+ | `~/.jupyter/nbi/codex-home/` | ACP agent configuration and session files, when an API key is configured |
58
60
 
59
61
  > Treat `~/.jupyter/nbi/config.json` and `~/.jupyter/nbi/user-data.json` as secrets. They contain your API keys and (encrypted) GitHub token. Do not commit them to git, share them, or sync them across users. If a key leaks, rotate it at the provider immediately.
60
62
 
@@ -74,7 +76,7 @@ LLM outputs are non-deterministic. Pinning the model name, temperature, and seed
74
76
 
75
77
  For HIPAA, FedRAMP, classroom, or otherwise restricted environments:
76
78
 
77
- - **Force local-only models.** Disable every cloud provider via `disabled_providers` and use Ollama. See the [HIPAA / sensitive-data preset](docs/admin-guide.md#hipaa--sensitive-data-preset) in the admin guide.
79
+ - **Force local-only models.** Disable every cloud provider via `disabled_providers`, force both agent modes off with `claude_mode_policy` and `acp_mode_policy`, and use Ollama. Disabling providers is not sufficient on its own: neither agent mode is a provider, and Claude mode is available to users unless an admin turns it off. See the [HIPAA / sensitive-data preset](docs/admin-guide.md#hipaa--sensitive-data-preset) in the admin guide.
78
80
  - **Restrict skill imports.** Block egress to `github.com` and serve managed skills from an internal manifest URL.
79
81
  - **Disable "remember GitHub Copilot login"** for shared systems where users share home directories.
80
82
  - **Pre-pull MCP servers** rather than allowing `npx -y` (which downloads from npmjs).
@@ -12,6 +12,8 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
12
12
  - [Feature highlights](#feature-highlights)
13
13
  - [Claude mode](#claude-mode)
14
14
  - [Agent mode](#agent-mode)
15
+ - [ACP agent mode](#acp-agent-mode)
16
+ - [Chatbook](#chatbook)
15
17
  - [Code generation with inline chat](#code-generation-with-inline-chat)
16
18
  - [Auto-complete](#auto-complete)
17
19
  - [Chat interface](#chat-interface)
@@ -41,7 +43,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
41
43
 
42
44
  - Python 3.10+
43
45
  - JupyterLab 4.x
44
- - Node.js — only required for [Claude mode](#claude-mode) (the Claude Code CLI) and for MCP servers that launch via `npx`.
46
+ - Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for [ACP agent mode](#acp-agent-mode), which launches its adapter with `npx` on every start, and for MCP servers that launch via `npx`.
45
47
  - A fresh virtualenv or conda env is recommended so NBI doesn't conflict with system Python.
46
48
 
47
49
  ## Quick start
@@ -150,6 +152,20 @@ In Agent mode, the built-in AI agent creates, edits, and executes notebooks for
150
152
 
151
153
  ![Agent mode](media/agent-mode.gif)
152
154
 
155
+ ### ACP agent mode
156
+
157
+ An experimental second agent mode that drives an external coding agent over the [Agent Client Protocol](https://agentclientprotocol.com/), with OpenAI Codex as the only agent type today. The agent runs as a subprocess and does its own file and command work, asking for approval through NBI's confirmation cards; NBI deliberately does not lend it the Jupyter server's filesystem or terminal.
158
+
159
+ It is off by default and the Settings tab stays hidden until an admin allows the mode, and it cannot be used at the same time as Claude mode. See [`docs/acp.md`](docs/acp.md).
160
+
161
+ ### Chatbook
162
+
163
+ A Chatbook is a notebook whose cells can be written in English. Running a prompt cell generates code for the notebook's backend kernel and runs it; each cell carries a badge showing whether it is a prompt (**NL**) or ordinary code (**Cd**), and `Ctrl J` switches between them.
164
+
165
+ What happens to generated code before it runs is yours to choose: **Always confirm** (the default) shows the code and waits, **Confirm if risky** waits only when a scan finds destructive calls, and **Auto-run** executes straight away. Admins can cap that choice fleet-wide, or turn Chatbook off entirely.
166
+
167
+ Prompts can pull in context with `@` mentions, rules apply to generation the same way they apply to chat, the backend kernel need not be Python, and a Chatbook exports to a plain code notebook when you want to hand someone the result instead of the prompts. See [`docs/chatbook.md`](docs/chatbook.md).
168
+
153
169
  ### Code generation with inline chat
154
170
 
155
171
  Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the inline chat popover.
@@ -160,7 +176,7 @@ Use the sparkle icon on the cell toolbar or the keyboard shortcut to show the in
160
176
 
161
177
  ### Auto-complete
162
178
 
163
- Auto-complete suggestions are shown as you type. `Tab` accepts. NBI provides auto-complete in code cells and Python file editors.
179
+ Auto-complete suggestions are shown as you type. `Tab` accepts one while it is on screen, and indents otherwise. NBI provides auto-complete in code cells and Python file editors.
164
180
 
165
181
  <img src="media/inline-completion.gif" alt="Auto-complete" width=700 />
166
182
 
@@ -180,6 +196,8 @@ Right-click a cell output (or hover for the toolbar) to send it straight into th
180
196
 
181
197
  Each is per-user toggleable from Settings (saved as `enable_explain_error`, `enable_output_followup`, `enable_output_toolbar` in `config.json`, default on) and admin-lockable via `NBI_EXPLAIN_ERROR_POLICY` / `NBI_OUTPUT_FOLLOWUP_POLICY` / `NBI_OUTPUT_TOOLBAR_POLICY`.
182
198
 
199
+ A revert is skipped while that document's kernel is busy, so a change landing mid-execution is applied when the cell finishes rather than swapped in under it, and the notice naming the reloaded file is shown only for the document you are looking at.
200
+
183
201
  ### Notebook toolbar generation
184
202
 
185
203
  Active notebooks show a sparkle icon on the toolbar. Click it to open a popover that scopes the generation request to that specific notebook — handy for multi-notebook sessions where you don't want the chat sidebar to compete for context.
@@ -486,7 +504,8 @@ Full guide, including the span and event reference, the probe thresholds, worked
486
504
  - [`docs/admin-guide.md`](docs/admin-guide.md) — deployment, env vars, security model, air-gap, multi-tenancy.
487
505
  - [`docs/skills.md`](docs/skills.md) — Claude Skills management and the org-manifest reconciler.
488
506
  - [`docs/rulesets.md`](docs/rulesets.md) — ruleset frontmatter and discovery.
489
- - [`docs/chatbook.md`](docs/chatbook.md) — Chatbook execution modes and why there is no per-cell sandbox.
507
+ - [`docs/acp.md`](docs/acp.md) — using the experimental ACP agent mode, and its limits.
508
+ - [`docs/chatbook.md`](docs/chatbook.md) — writing Chatbook cells, execution modes, export, and why there is no per-cell sandbox.
490
509
  - [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md) — dynamic Chatbook context and mention providers.
491
510
  - [`docs/troubleshooting.md`](docs/troubleshooting.md) — common problems with copy-pasteable fixes.
492
511
  - [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md): turn timelines, the environment probe, and how to read both.
@@ -504,7 +523,7 @@ Full guide, including the span and event reference, the probe thresholds, worked
504
523
 
505
524
  ## Roadmap
506
525
 
507
- NBI 5.x is stable. New features land in minor releases (5.1, 5.2, …); breaking changes are reserved for the next major (6.x) and will be announced in the [changelog](CHANGELOG.md). Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
526
+ NBI 6.x is the current line. New features land in minor releases (6.1, 6.2, …); breaking changes are reserved for a major release and announced in the [changelog](CHANGELOG.md). 6.0 itself is not a breaking release: it marks Chatbook's arrival, and no traitlet, env var, REST route, or on-disk format was renamed or removed, so upgrading from 5.x needs no migration. Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
508
527
 
509
528
  ## License
510
529
 
@@ -14,13 +14,22 @@ Python package. Before generating a package, you first need to install some tool
14
14
  pip install build twine hatch
15
15
  ```
16
16
 
17
- Bump the version using `hatch`. By default this will create a tag.
18
- See the docs on [hatch-nodejs-version](https://github.com/agoose77/hatch-nodejs-version#semver) for details.
17
+ Bump the version using `hatch`. See the docs on
18
+ [hatch-nodejs-version](https://github.com/agoose77/hatch-nodejs-version#semver) for details.
19
19
 
20
20
  ```bash
21
21
  hatch version <new-version>
22
22
  ```
23
23
 
24
+ `hatch version` writes the version; it does not tag. Tag the release yourself
25
+ afterwards, and spell the tag the way the existing history does
26
+ (`v5.4.0`, `v5.4.0a1`) rather than with a hyphen before the prerelease segment.
27
+
28
+ Before tagging, add the release's entry to [`CHANGELOG.md`](CHANGELOG.md) above
29
+ the `<!-- <START NEW CHANGELOG ENTRY> -->` marker, date the heading, and add its
30
+ compare link at the foot of the file. The Jupyter Releaser workflows below read
31
+ that marker, so an entry added after the fact is not picked up.
32
+
24
33
  Make sure to clean up all the development files before building the package:
25
34
 
26
35
  ```bash
@@ -0,0 +1,53 @@
1
+ # Security Policy
2
+
3
+ ## Reporting a vulnerability
4
+
5
+ **Do not** open a public GitHub issue for security vulnerabilities.
6
+
7
+ Email the maintainer directly at **mbektasgh@outlook.com** with:
8
+
9
+ - A description of the vulnerability and the impact you observed.
10
+ - Steps to reproduce, including affected versions of NBI, JupyterLab, and Python.
11
+ - Any proof-of-concept code or logs (redact secrets).
12
+
13
+ Expect an acknowledgement within five business days. Once we confirm the issue, we'll work with you on a coordinated disclosure timeline.
14
+
15
+ ## Supported versions
16
+
17
+ NBI follows semantic versioning starting with 4.0.0. Security fixes land on the latest minor release of the current major line. Earlier major lines are not actively maintained.
18
+
19
+ | Version | Supported |
20
+ | ------- | ------------------ |
21
+ | 6.x | Yes (latest minor) |
22
+ | < 6.0 | No |
23
+
24
+ ## Scope
25
+
26
+ In-scope:
27
+
28
+ - The `notebook_intelligence` server extension and its HTTP handlers.
29
+ - The `@plmbr/notebook-intelligence` JupyterLab frontend.
30
+ - Built-in tools (`nbi-notebook-edit`, `nbi-notebook-execute`, `nbi-python-file-edit`, `nbi-file-edit`, `nbi-file-read`, `nbi-command-execute`).
31
+ - The Claude Skills import and managed-manifest reconciler.
32
+ - ACP agent mode: the protocol router, what NBI serves or refuses an agent, and the credential handling around the adapter subprocess.
33
+ - The Chatbook kernel and its generate API, which execute model-written code as the user.
34
+ - The UI-tools relay (`/notebook-intelligence/ui-tools`) and the `notebook_intelligence.mcp_ui_proxy` standalone server.
35
+
36
+ Out of scope:
37
+
38
+ - Vulnerabilities in upstream dependencies (`litellm`, `anthropic`, `openai`, `ollama`, `claude-agent-sdk`, `mcp`, `agent-client-protocol`) — please report those upstream. We will pick up patched releases when they ship.
39
+ - Vulnerabilities in MCP servers users install from third-party sources.
40
+ - Vulnerabilities in LLM providers themselves (data handling at OpenAI, Anthropic, GitHub Copilot, etc.).
41
+
42
+ ## Security model
43
+
44
+ NBI is a **per-user** tool. The server extension runs inside the user's Jupyter Server process and inherits that user's permissions. Built-in tools shell out as the user, MCP stdio servers run as the user, the Chatbook kernel executes generated code as the user, and the Claude Code CLI inherits the user's environment. There is no privilege boundary between the extension and the user's account.
45
+
46
+ Within that, a few boundaries are deliberate and worth stating, because they are what a report should be measured against:
47
+
48
+ - **An ACP agent is not lent the client's reach.** NBI refuses filesystem reads and writes, terminal methods, and agent extension requests at the protocol router, so the agent does its own I/O under its own sandbox rather than through the Jupyter server process. The approval cards are the mediation point, with the honest limit that the agent chooses what to ask about.
49
+ - **Approval prompts are rendered so they cannot be forged.** Command text is fenced with a collision-resistant delimiter and bidirectional control characters are rejected, so what an approval card shows is what would run.
50
+ - **Commands the backend can ask the frontend to run are allowlisted** at a single chokepoint, rather than being any JupyterLab command id. `run-command-in-terminal` stays on that list, so shell reachability is unchanged by it.
51
+ - **`mcp_stdio_command_allowlist`** is the mitigation admins have for stdio MCP servers, which otherwise run any command an `mcp.json` names. See [Restricting MCP stdio commands](docs/admin-guide.md#restricting-mcp-stdio-commands).
52
+
53
+ For multi-tenant deployments, see [`docs/admin-guide.md`](docs/admin-guide.md) for guidance on disabling features that are unsafe to expose without additional sandboxing (notably `nbi-command-execute` and `nbi-file-edit`).
@@ -0,0 +1,34 @@
1
+ # ACP agent mode
2
+
3
+ ACP mode drives an external coding agent over the [Agent Client Protocol](https://agentclientprotocol.com/) instead of using NBI's own chat path. It is experimental, off by default, and mutually exclusive with Claude mode: enabling one disables the other.
4
+
5
+ OpenAI Codex, through the `codex-acp` adapter, is the only agent type available today.
6
+
7
+ For the admin side of this feature (the two policies, the approval posture NBI pins, credential containment, and the known limitations) see [Gating the experimental ACP agent](admin-guide.md#gating-the-experimental-acp-agent-378). This page is about using it.
8
+
9
+ ## Turning it on
10
+
11
+ The **ACP** tab in Settings is hidden until an admin allows the mode, because `acp_mode_policy` defaults to `force-off`. If you do not see the tab, that is why; ask for `NBI_ACP_MODE_POLICY=user-choice`.
12
+
13
+ With the tab visible, pick the agent type, then set the chat model, API key, and base URL. The adapter is launched with `npx` on every agent start, so the server needs Node.js on its `PATH` even though nothing is installed permanently.
14
+
15
+ ## What a turn looks like
16
+
17
+ The agent runs as a subprocess and does its own work: it reads and writes files itself, and runs its own commands. NBI deliberately does not serve it the client filesystem or terminal methods, so the agent cannot borrow the Jupyter server process's reach; it is confined to whatever sandbox the agent applies to itself, which is what the admin policies pin.
18
+
19
+ When the agent wants to do something it considers worth asking about, NBI shows an approval card naming the command and the reason the agent gave. Approving grants a lasting permission for that kind of action in the session, not a one-off, so a later action of the same kind may not ask again. The agent decides what to ask about; NBI shows what it is asked, and cannot promise that everything the agent does passes through a card.
20
+
21
+ Previous sessions are listed by the history control, and picking one resumes it through the agent's own session storage rather than NBI's.
22
+
23
+ ## Limits worth knowing
24
+
25
+ - **The first start is slow, and it is bounded.** An agent has 60 seconds to spawn, download the adapter through `npx`, initialize, authenticate, and create a session. On a cold cache over a slow link the download alone can exceed that, and the failure reads `ACP agent did not start in time`. Run the adapter command once by hand to warm the cache, or point `NBI_ACP_AGENT_COMMAND` at a pre-installed copy.
26
+ - **A turn is capped at 30 minutes**, after which it fails with an agent response timeout.
27
+ - **Session listing is optional.** Resuming depends on the agent advertising the capability, and listing is an optional protocol extension. An agent that implements neither reports that it does not support listing sessions; this is the agent's limitation, not a misconfiguration.
28
+ - **Chatbook uses ACP differently.** When ACP mode is active, Chatbook generation runs in a separate session with full access forced off, no MCP servers, and permission requests denied, so a Chatbook cell cannot approve its way into running commands.
29
+
30
+ ## Where its state lives
31
+
32
+ When you configure an API key, NBI points the agent at an isolated `CODEX_HOME` under `~/.jupyter/nbi/codex-home/` so it reads neither the workspace's nor your personal `~/.codex` configuration. Its session files live there. Signing in through the agent's own ChatGPT flow instead uses your `~/.codex` as usual.
33
+
34
+ See [`PRIVACY.md`](../PRIVACY.md) for what leaves the machine in this mode.
@@ -278,7 +278,8 @@ Steps for deploying to a network with no general internet egress:
278
278
  2. **Manifest hosting.** Set `NBI_SKILLS_MANIFEST` to either a `file://` path (a manifest baked into the image) or an internal `https://` URL on a network the pod can reach.
279
279
  3. **Skill bundles.** Either bake the skills into the image under `~/.claude/skills/` (managed status will reset since they aren't from the manifest), or host the GitHub-style tarballs at an internal mirror and write the manifest URLs to point at it.
280
280
  4. **Disable user-initiated GitHub imports** at the network layer — block `github.com`, `codeload.github.com`, and `raw.githubusercontent.com`. Users can still install skills from the local filesystem by dropping bundles into `~/.claude/skills/`.
281
- 5. **MCP `npx -y` is incompatible with air-gap.** Pre-install the server binary and reference it directly:
281
+ 5. **ACP mode is `npx`-only by default.** The adapter is fetched with `npx` on every agent start, so an air-gapped deployment must either leave ACP off (it is `force-off` by default) or pre-install the adapter and point `NBI_ACP_AGENT_COMMAND` at it. A replacement command must still accept the `-c` overrides NBI passes, or the approval posture those pin is lost.
282
+ 6. **MCP `npx -y` is incompatible with air-gap.** Pre-install the server binary and reference it directly:
282
283
 
283
284
  ```json
284
285
  {
@@ -291,7 +292,7 @@ Steps for deploying to a network with no general internet egress:
291
292
  }
292
293
  ```
293
294
 
294
- 6. **LLM endpoint.** Air-gap requires a self-hosted endpoint (vLLM, TGI, or a LiteLLM proxy in front of a VPC-endpoint Bedrock, etc.). See [Self-hosted LLM endpoints](#self-hosted-llm-endpoints).
295
+ 7. **LLM endpoint.** Air-gap requires a self-hosted endpoint (vLLM, TGI, or a LiteLLM proxy in front of a VPC-endpoint Bedrock, etc.). See [Self-hosted LLM endpoints](#self-hosted-llm-endpoints).
295
296
 
296
297
  ---
297
298
 
@@ -309,8 +310,17 @@ c.NotebookIntelligence.disabled_providers = [
309
310
  c.NotebookIntelligence.allow_enabling_providers_with_env = False # users cannot override
310
311
  c.NotebookIntelligence.disabled_tools = ["nbi-command-execute", "nbi-file-edit"]
311
312
  c.NotebookIntelligence.allow_enabling_tools_with_env = False
313
+
314
+ # Both agent modes reach a cloud provider without going through the provider
315
+ # list above, so disabling providers alone does not make a deployment
316
+ # local-only. acp_mode is already force-off by default; it is pinned here so
317
+ # the preset keeps working if that default is ever relaxed.
318
+ c.NotebookIntelligence.claude_mode_policy = "force-off"
319
+ c.NotebookIntelligence.acp_mode_policy = "force-off"
312
320
  ```
313
321
 
322
+ > **`disabled_providers` does not gate Claude mode or ACP mode.** Whether an agent mode handles a turn is read from its own settings (`claude_settings.enabled` / `acp_settings.enabled`), not from the provider list, and `claude_mode_policy` otherwise defaults to `user-choice`. Without the two policy lines above, a user can enable Claude mode and send data to Anthropic through the Claude Code CLI, which can hold a subscription login the deployment never issued a key for.
323
+
314
324
  Pair with `<env-prefix>/share/jupyter/nbi/config.json` selecting the Ollama provider and your local models:
315
325
 
316
326
  ```json
@@ -912,6 +922,7 @@ NBI is tested against the JupyterLab and `jupyter_server` versions declared in [
912
922
 
913
923
  | NBI version | JupyterLab | jupyter_server | Python |
914
924
  | ----------- | ---------- | -------------- | --------- |
925
+ | 6.0.x | 4.x | 2.x | 3.10+ |
915
926
  | 5.4.x | 4.x | 2.x | 3.10+ |
916
927
  | 5.3.x | 4.x | 2.x | 3.10+ |
917
928
  | 5.2.x | 4.x | 2.x | 3.10+ |
@@ -137,7 +137,7 @@ The loader logs WARN and falls back to defaults for:
137
137
  - File exceeds the 32 KB cap.
138
138
  - YAML/JSON parse error.
139
139
  - Top-level value is not a mapping.
140
- - Unknown top-level key (`steps`, `ui` are the only recognized ones).
140
+ - Unknown top-level key (`steps`, `ui`, and `command` are the only recognized ones).
141
141
  - Unknown step id under `steps`.
142
142
  - Unknown field under a step (e.g. `placement: top`).
143
143
  - Type mismatch (`enabled: "true"` as a string, `title: 42` as an int).
@@ -36,7 +36,7 @@ instructions.
36
36
  Durable conventions belong in the ruleset (`~/.jupyter/nbi/rules/` and optional
37
37
  `modes/chatbook/`) or project `AGENTS.md`, not in a context provider. See
38
38
  [`rulesets.md`](rulesets.md). Execution policy (confirm before running generated
39
- Python) is configured in Settings → Chatbook; see [`chatbook.md`](chatbook.md).
39
+ code) is configured in Settings → Chatbook; see [`chatbook.md`](chatbook.md).
40
40
 
41
41
  ## Mention providers
42
42