notebook-intelligence 6.2.0__tar.gz → 6.3.0a1__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 (371) hide show
  1. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.gitignore +3 -0
  2. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/AGENTS.md +3 -0
  3. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/CHANGELOG.md +49 -3
  4. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/CONTRIBUTING.md +57 -0
  5. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/PKG-INFO +22 -11
  6. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/PRIVACY.md +13 -13
  7. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/README.md +14 -6
  8. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/acp.md +3 -2
  9. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/admin-guide.md +46 -7
  10. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/admin-tour-config.md +7 -0
  11. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/chatbook.md +5 -3
  12. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/performance-diagnostics.md +0 -2
  13. notebook_intelligence-6.3.0a1/docs/translating.md +69 -0
  14. notebook_intelligence-6.3.0a1/hatch_build.py +140 -0
  15. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/jest.config.js +3 -1
  16. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/_version.py +1 -1
  17. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/acp_agent.py +124 -67
  18. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/acp_mcp_server.py +16 -4
  19. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/acp_registry.py +169 -12
  20. notebook_intelligence-6.3.0a1/notebook_intelligence/acp_runtime.py +112 -0
  21. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/ai_service_manager.py +6 -4
  22. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/api.py +25 -6
  23. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/base_chat_participant.py +15 -10
  24. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/built_in_toolsets.py +23 -0
  25. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_generate.py +23 -8
  26. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/claude.py +33 -20
  27. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/claude_sessions.py +2 -1
  28. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/config.py +6 -0
  29. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/extension.py +163 -42
  30. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/github_copilot.py +13 -2
  31. notebook_intelligence-6.3.0a1/notebook_intelligence/i18n.py +275 -0
  32. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/package.json +60 -8
  33. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/package.json.orig +59 -7
  34. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/schemas/@plmbr/notebook-intelligence/plugin.json +0 -1
  35. notebook_intelligence-6.3.0a1/notebook_intelligence/labextension/static/128.0480c0673df28c8cb3b0.js +1 -0
  36. notebook_intelligence-6.3.0a1/notebook_intelligence/labextension/static/728.4dd1e71dd776376d226a.js +1 -0
  37. notebook_intelligence-6.3.0a1/notebook_intelligence/labextension/static/editor.worker.js +1407 -0
  38. notebook_intelligence-6.3.0a1/notebook_intelligence/labextension/static/remoteEntry.6e66faf51ed6fc837255.js +1 -0
  39. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/third-party-licenses.json +8 -14
  40. notebook_intelligence-6.3.0a1/notebook_intelligence/llm_providers/property_labels.py +67 -0
  41. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ar_SA/LC_MESSAGES/notebook_intelligence.po +4375 -0
  42. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ca_ES/LC_MESSAGES/notebook_intelligence.po +4247 -0
  43. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/cs_CZ/LC_MESSAGES/notebook_intelligence.po +4279 -0
  44. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/da_DK/LC_MESSAGES/notebook_intelligence.po +4247 -0
  45. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/de_DE/LC_MESSAGES/notebook_intelligence.po +4247 -0
  46. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/el_GR/LC_MESSAGES/notebook_intelligence.po +4247 -0
  47. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/es_ES/LC_MESSAGES/notebook_intelligence.po +4247 -0
  48. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/et_EE/LC_MESSAGES/notebook_intelligence.po +4247 -0
  49. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/fi_FI/LC_MESSAGES/notebook_intelligence.po +4247 -0
  50. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/fr_FR/LC_MESSAGES/notebook_intelligence.po +4247 -0
  51. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/he_IL/LC_MESSAGES/notebook_intelligence.po +4247 -0
  52. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/hu_HU/LC_MESSAGES/notebook_intelligence.po +4215 -0
  53. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/hy_AM/LC_MESSAGES/notebook_intelligence.po +4215 -0
  54. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/id_ID/LC_MESSAGES/notebook_intelligence.po +4247 -0
  55. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/it_IT/LC_MESSAGES/notebook_intelligence.po +4247 -0
  56. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ja_JP/LC_MESSAGES/notebook_intelligence.po +4215 -0
  57. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ko_KR/LC_MESSAGES/notebook_intelligence.po +4215 -0
  58. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/lt_LT/LC_MESSAGES/notebook_intelligence.po +4279 -0
  59. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/nl_NL/LC_MESSAGES/notebook_intelligence.po +4247 -0
  60. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/no_NO/LC_MESSAGES/notebook_intelligence.po +4247 -0
  61. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/notebook_intelligence.pot +4234 -0
  62. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/pl_PL/LC_MESSAGES/notebook_intelligence.po +4279 -0
  63. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/pt_BR/LC_MESSAGES/notebook_intelligence.po +4247 -0
  64. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ro_RO/LC_MESSAGES/notebook_intelligence.po +4279 -0
  65. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/ru_RU/LC_MESSAGES/notebook_intelligence.po +4279 -0
  66. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/tr_TR/LC_MESSAGES/notebook_intelligence.po +4215 -0
  67. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/uk_UA/LC_MESSAGES/notebook_intelligence.po +4279 -0
  68. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/vi_VN/LC_MESSAGES/notebook_intelligence.po +4215 -0
  69. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/zh_CN/LC_MESSAGES/notebook_intelligence.po +4215 -0
  70. notebook_intelligence-6.3.0a1/notebook_intelligence/locale/zh_TW/LC_MESSAGES/notebook_intelligence.po +4215 -0
  71. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_manager.py +4 -2
  72. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/readiness.py +299 -202
  73. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/package.json +59 -7
  74. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/pyproject.toml +50 -11
  75. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/schema/plugin.json +0 -1
  76. notebook_intelligence-6.3.0a1/scripts/i18n.py +381 -0
  77. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_acp_agent.py +427 -12
  78. notebook_intelligence-6.3.0a1/tests/test_acp_registry.py +609 -0
  79. notebook_intelligence-6.3.0a1/tests/test_acp_runtime.py +203 -0
  80. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_ai_service_manager_dispatch.py +3 -0
  81. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_base_chat_participant_integration.py +33 -0
  82. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_bash_approval_rendering.py +3 -1
  83. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_client.py +3 -2
  84. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_github_copilot_llm_provider.py +3 -0
  85. notebook_intelligence-6.3.0a1/tests/test_i18n_catalogs.py +338 -0
  86. notebook_intelligence-6.3.0a1/tests/test_i18n_server.py +425 -0
  87. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_readiness.py +312 -13
  88. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_websocket_handler_integration.py +98 -0
  89. notebook_intelligence-6.3.0a1/tests/ts/__mocks__/jupyterlab-translation.ts +61 -0
  90. notebook_intelligence-6.3.0a1/tests/ts/api-websocket-queue.test.ts +141 -0
  91. notebook_intelligence-6.3.0a1/tests/ts/builtin-toolset-labels.test.ts +25 -0
  92. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-toolbar-convert.test.ts +35 -1
  93. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook.test.ts +7 -2
  94. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/claude-mcp-paste.test.ts +43 -17
  95. notebook_intelligence-6.3.0a1/tests/ts/i18n-chat.test.tsx +79 -0
  96. notebook_intelligence-6.3.0a1/tests/ts/i18n-chatbook.test.ts +72 -0
  97. notebook_intelligence-6.3.0a1/tests/ts/i18n-panels.test.ts +47 -0
  98. notebook_intelligence-6.3.0a1/tests/ts/i18n-perf.test.ts +21 -0
  99. notebook_intelligence-6.3.0a1/tests/ts/i18n-server-locale.test.ts +60 -0
  100. notebook_intelligence-6.3.0a1/tests/ts/i18n-settings.test.tsx +122 -0
  101. notebook_intelligence-6.3.0a1/tests/ts/i18n-skills.test.tsx +67 -0
  102. notebook_intelligence-6.3.0a1/tests/ts/i18n-tour.test.ts +136 -0
  103. notebook_intelligence-6.3.0a1/tests/ts/i18n.test.tsx +125 -0
  104. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/mcp-util.test.ts +20 -3
  105. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/perf-panel.test.tsx +3 -2
  106. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/plugins-panel.test.tsx +8 -5
  107. notebook_intelligence-6.3.0a1/tests/ts/pseudo-translator.ts +42 -0
  108. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/settings-tab-name.test.tsx +2 -2
  109. notebook_intelligence-6.3.0a1/tests/ts/terminal-drag.test.ts +561 -0
  110. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/README.md +10 -9
  111. notebook_intelligence-6.3.0a1/ui-tests/tests/i18n.spec.ts +140 -0
  112. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/yarn.lock +68 -41
  113. notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/7.b660d984046388f395e5.js +0 -1
  114. notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/728.5359de99fbe302f4380b.js +0 -1
  115. notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/editor.worker.js +0 -1407
  116. notebook_intelligence-6.2.0/notebook_intelligence/labextension/static/remoteEntry.10c9ca7e4b3cffb98413.js +0 -1
  117. notebook_intelligence-6.2.0/tests/ts/terminal-drag.test.ts +0 -183
  118. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.copier-answers.yml +0 -0
  119. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.editorconfig +0 -0
  120. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/.gitignore +0 -0
  121. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/applypatch-msg +0 -0
  122. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/commit-msg +0 -0
  123. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/h +0 -0
  124. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/husky.sh +0 -0
  125. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-applypatch +0 -0
  126. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-checkout +0 -0
  127. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-commit +0 -0
  128. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-merge +0 -0
  129. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/post-rewrite +0 -0
  130. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-applypatch +0 -0
  131. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-auto-gc +0 -0
  132. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-commit +0 -0
  133. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-merge-commit +0 -0
  134. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-push +0 -0
  135. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/pre-rebase +0 -0
  136. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/_/prepare-commit-msg +0 -0
  137. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.husky/pre-commit +0 -0
  138. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.prettierignore +0 -0
  139. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.vscode/extensions.json +0 -0
  140. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.vscode/settings.json +0 -0
  141. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/.yarnrc.yml +0 -0
  142. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/CLAUDE.md +0 -0
  143. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/LICENSE +0 -0
  144. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/RELEASE.md +0 -0
  145. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/SECURITY.md +0 -0
  146. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/README.md +0 -0
  147. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/bench_nbi_ws.py +0 -0
  148. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/bench_runner.py +0 -0
  149. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/bench_terminal.py +0 -0
  150. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/prompts.py +0 -0
  151. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/report.py +0 -0
  152. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/benchmarks/claude_perf/stats.py +0 -0
  153. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/chatbook-extensions.md +0 -0
  154. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/rulesets.md +0 -0
  155. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/skills.md +0 -0
  156. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/docs/troubleshooting.md +0 -0
  157. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/install.json +0 -0
  158. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/jupyter-config/server-config/notebook_intelligence.json +0 -0
  159. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/__init__.py +0 -0
  160. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/_claude_cli.py +0 -0
  161. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/cell_output.py +0 -0
  162. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chat_history_budget.py +0 -0
  163. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/__init__.py +0 -0
  164. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/__main__.py +0 -0
  165. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/backend.py +0 -0
  166. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/codegen.py +0 -0
  167. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/danger.py +0 -0
  168. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/execution.py +0 -0
  169. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/kernel.py +0 -0
  170. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/kernelspec/kernel.json +0 -0
  171. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/kernelspec/logo-svg.svg +0 -0
  172. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_kernel/nbi_client.py +0 -0
  173. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/chatbook_mentions.py +0 -0
  174. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/checks.py +0 -0
  175. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/claude_mcp_manager.py +0 -0
  176. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/context_factory.py +0 -0
  177. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/feature_flags.py +0 -0
  178. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/github_copilot_chat_participant.py +0 -0
  179. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/inline_completion.py +0 -0
  180. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/156.7e517ead254858a9eb50.js +0 -0
  181. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/196.ae4c84cd4812d9d7cbcf.js +0 -0
  182. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/1b55f12eca93ba6743e7.ttf +0 -0
  183. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/24c0eed6cf7014abfb18.module.wasm +0 -0
  184. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js +0 -0
  185. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/326.9fc28ccfe3ac71ac4b73.js.LICENSE.txt +0 -0
  186. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/537.e250b395dd56252f433b.js +0 -0
  187. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/631.c3b7a19d8e9bb293fff8.js +0 -0
  188. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js +0 -0
  189. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/67.c8b2c6b35e88046e69ea.js.LICENSE.txt +0 -0
  190. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/671.dd4f3f162a9464547691.js +0 -0
  191. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/694.97c3499ce07ad99e125a.js +0 -0
  192. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/768.7edd3110b64beb9041b7.js +0 -0
  193. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/938a2c885cbaa713e543.module.wasm +0 -0
  194. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/976.7dffd54c5614c4e8083f.js +0 -0
  195. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/editor.worker.js.LICENSE.txt +0 -0
  196. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/labextension/static/style.js +0 -0
  197. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/llm_providers/github_copilot_llm_provider.py +0 -0
  198. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/llm_providers/litellm_compatible_llm_provider.py +0 -0
  199. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/llm_providers/ollama_llm_provider.py +0 -0
  200. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/llm_providers/openai_compatible_llm_provider.py +0 -0
  201. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_client.py +0 -0
  202. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_config_validation.py +0 -0
  203. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_policy.py +0 -0
  204. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/mcp_ui_proxy.py +0 -0
  205. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/perf.py +0 -0
  206. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/perf_probe.py +0 -0
  207. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/plugin_manager.py +0 -0
  208. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/prompts.py +0 -0
  209. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/rule_injector.py +0 -0
  210. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/rule_manager.py +0 -0
  211. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/ruleset.py +0 -0
  212. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skill_github_import.py +0 -0
  213. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skill_manager.py +0 -0
  214. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skill_manifest.py +0 -0
  215. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skill_reconciler.py +0 -0
  216. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/skillset.py +0 -0
  217. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/tour_config.py +0 -0
  218. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/notebook_intelligence/util.py +0 -0
  219. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/setup.py +0 -0
  220. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/conftest.py +0 -0
  221. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/01-test-global.md +0 -0
  222. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/02-test-security.md +0 -0
  223. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/03-invalid-rule.md +0 -0
  224. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/modes/agent/01-test-production.md +0 -0
  225. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/modes/ask/01-test-exploration.md +0 -0
  226. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/fixtures/rules/modes/inline-chat/01-test-quick.md +0 -0
  227. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_ai_service_manager_integration.py +0 -0
  228. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_api_hygiene.py +0 -0
  229. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_builtin_cell_output.py +0 -0
  230. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_builtin_file_read.py +0 -0
  231. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_builtin_search_files_sandbox.py +0 -0
  232. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_builtin_toolset_cwd_sandbox.py +0 -0
  233. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_cell_output.py +0 -0
  234. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_cell_output_features_response.py +0 -0
  235. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chat_history_budget.py +0 -0
  236. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook.py +0 -0
  237. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook_backend.py +0 -0
  238. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook_danger.py +0 -0
  239. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook_enable.py +0 -0
  240. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_chatbook_perf.py +0 -0
  241. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_mcp_manager.py +0 -0
  242. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_models.py +0 -0
  243. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_sdk_mcp_server.py +0 -0
  244. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_sessions.py +0 -0
  245. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_sessions_handler.py +0 -0
  246. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_system_prompt.py +0 -0
  247. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_tool_humanizer.py +0 -0
  248. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_tool_path_sandbox.py +0 -0
  249. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_tool_results.py +0 -0
  250. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_claude_turn_usage.py +0 -0
  251. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_coding_agent_launchers.py +0 -0
  252. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_config_atomic_save.py +0 -0
  253. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_config_handler_claude_settings.py +0 -0
  254. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_config_integration.py +0 -0
  255. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_context_factory.py +0 -0
  256. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_default_password_refusal.py +0 -0
  257. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_disabled_provider_models.py +0 -0
  258. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_enabled_providers_env.py +0 -0
  259. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_end_to_end_rule_integration.py +0 -0
  260. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_feature_flags.py +0 -0
  261. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_feedback.py +0 -0
  262. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_file_upload.py +0 -0
  263. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_github_copilot_login_gating.py +0 -0
  264. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_github_copilot_user_data_mode.py +0 -0
  265. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_image_context.py +0 -0
  266. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_inline_completion_shortcuts.py +0 -0
  267. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_lazy_provider_imports.py +0 -0
  268. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_litellm_compatible_llm_provider.py +0 -0
  269. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_client_shim.py +0 -0
  270. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_config_validation.py +0 -0
  271. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_manager.py +0 -0
  272. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_manager_command_allowlist.py +0 -0
  273. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_null_config.py +0 -0
  274. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_mcp_policy.py +0 -0
  275. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_models.py +0 -0
  276. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_openai_compatible_llm_provider.py +0 -0
  277. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_perf.py +0 -0
  278. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_perf_instrumentation.py +0 -0
  279. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_perf_probe.py +0 -0
  280. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_permission_modes.py +0 -0
  281. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_plugin_manager.py +0 -0
  282. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_policy_gate.py +0 -0
  283. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_process_tree_teardown.py +0 -0
  284. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_provider_stream_cancellation.py +0 -0
  285. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_redact_process_secrets.py +0 -0
  286. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_response_emitter.py +0 -0
  287. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_rule_auto_reload.py +0 -0
  288. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_rule_injector.py +0 -0
  289. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_rule_manager.py +0 -0
  290. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_run_ui_command_allowlist_parity.py +0 -0
  291. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_safe_anchor_uri.py +0 -0
  292. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_fetch_redirects.py +0 -0
  293. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_github_import.py +0 -0
  294. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_manager.py +0 -0
  295. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_manifest.py +0 -0
  296. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skill_reconciler.py +0 -0
  297. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_skills_handlers.py +0 -0
  298. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_tour_config.py +0 -0
  299. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_tour_disabled.py +0 -0
  300. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_user_input_wait.py +0 -0
  301. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_ws_callback_handler_leak.py +0 -0
  302. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/test_ws_handler_auth.py +0 -0
  303. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/jupyterlab-apputils.ts +0 -0
  304. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/jupyterlab-filebrowser.ts +0 -0
  305. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/strip-ansi.ts +0 -0
  306. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/svg.ts +0 -0
  307. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/__mocks__/tiktoken.ts +0 -0
  308. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/ask-user-question.test.tsx +0 -0
  309. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/cell-output-bundle.test.ts +0 -0
  310. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/cell-output-features.test.ts +0 -0
  311. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/cell-output-toolbar.test.ts +0 -0
  312. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-cancel.test.ts +0 -0
  313. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-prefix-suggestions.test.ts +0 -0
  314. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-progress-feedback.test.ts +0 -0
  315. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-stopped-turn.test.ts +0 -0
  316. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chat-transcript.test.ts +0 -0
  317. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-convert.test.ts +0 -0
  318. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-execute.test.ts +0 -0
  319. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-mentions-menu.test.ts +0 -0
  320. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-mentions.test.ts +0 -0
  321. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/chatbook-summarize.test.ts +0 -0
  322. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/checkbox.test.tsx +0 -0
  323. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/choose-workspace-directory.test.ts +0 -0
  324. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/coding-agent-launchers.test.ts +0 -0
  325. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/confirmation-details.test.tsx +0 -0
  326. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/inline-completer-telemetry.test.ts +0 -0
  327. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/inline-completion-origin.test.ts +0 -0
  328. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/inline-completion-request.test.ts +0 -0
  329. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/launcher-picker.test.tsx +0 -0
  330. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/markdown-code-class.test.ts +0 -0
  331. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/markdown-renderer.test.tsx +0 -0
  332. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/mcp-config-save.test.ts +0 -0
  333. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/mcp-config-temp-file.test.ts +0 -0
  334. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/notebook-generation.test.ts +0 -0
  335. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/open-file-refresh-watcher.test.ts +0 -0
  336. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/permission-mode-select.test.tsx +0 -0
  337. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/readiness-card.test.tsx +0 -0
  338. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/response-stream-command-allowlist.test.ts +0 -0
  339. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/safe-anchor.test.tsx +0 -0
  340. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/select-theme-css.test.ts +0 -0
  341. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/settings-property-field.test.tsx +0 -0
  342. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/settings-required-property.test.ts +0 -0
  343. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/setup.ts +0 -0
  344. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/skill-wire-format.test.ts +0 -0
  345. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/task-target-notebook.test.ts +0 -0
  346. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tool-call-card.test.tsx +0 -0
  347. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tool-call-group.test.tsx +0 -0
  348. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tool-call-stream.test.ts +0 -0
  349. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tour-config.test.ts +0 -0
  350. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tour-events.test.ts +0 -0
  351. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tour-overlay.test.tsx +0 -0
  352. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tour-state.test.ts +0 -0
  353. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/tsconfig.json +0 -0
  354. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/utils.test.ts +0 -0
  355. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tests/ts/workspace-skips.test.ts +0 -0
  356. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/tsconfig.json +0 -0
  357. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/.eslintrc.js +0 -0
  358. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/jupyter_server_test_config.py +0 -0
  359. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/package.json +0 -0
  360. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/playwright.config.ts +0 -0
  361. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/cell-output.spec.ts +0 -0
  362. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/chat-sidebar.spec.ts +0 -0
  363. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/chatbook-cell-mode-badge.spec.ts +0 -0
  364. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/claude-mcp-patch.spec.ts +0 -0
  365. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/extension.spec.ts +0 -0
  366. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/helpers.ts +0 -0
  367. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/launcher.spec.ts +0 -0
  368. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tests/notebook-toolbar.spec.ts +0 -0
  369. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/tsconfig.json +0 -0
  370. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/ui-tests/yarn.lock +0 -0
  371. {notebook_intelligence-6.2.0 → notebook_intelligence-6.3.0a1}/webpack.config.js +0 -0
@@ -8,6 +8,8 @@ node_modules/
8
8
  .ipynb_checkpoints
9
9
  *.tsbuildinfo
10
10
  notebook_intelligence/labextension
11
+ # Compiled translation bundles; only the .po sources are committed
12
+ notebook_intelligence/locale/*/LC_MESSAGES/*.json
11
13
  # Version file is handled by hatchling
12
14
  notebook_intelligence/_version.py
13
15
 
@@ -70,6 +72,7 @@ coverage.xml
70
72
  # Translations
71
73
  *.mo
72
74
  *.pot
75
+ !notebook_intelligence/locale/notebook_intelligence.pot
73
76
 
74
77
  # Scrapy stuff:
75
78
  .scrapy
@@ -13,6 +13,8 @@ jlpm lint:check
13
13
  jlpm jest
14
14
  ```
15
15
 
16
+ If you added or changed a user-visible string, also run `jlpm i18n:extract` (CI's `jlpm i18n:check` fails on a stale translation template). It needs `pip install -e ".[i18n]"`.
17
+
16
18
  If `jlpm lint:check` reports formatting problems, run `jlpm lint` to auto-fix them with the repo's Prettier (this covers Markdown too).
17
19
 
18
20
  ## JavaScript tooling
@@ -24,4 +26,5 @@ If `jlpm lint:check` reports formatting problems, run `jlpm lint` to auto-fix th
24
26
  ## Code conventions
25
27
 
26
28
  - Adding an admin policy touches seven places. The comment above `FEATURE_POLICY_SPEC` in `notebook_intelligence/extension.py` lists them all; update every one, or the policy silently stops working in one direction.
29
+ - Every user-visible string goes through JupyterLab's translator: `const trans = getTrans();` (or `useTrans()` in a component) from `src/i18n.ts`, then `trans.__('Saved %1', name)`. The local must be named `trans` or the extractor misses it. Use placeholders instead of concatenation, and do not translate at module load. Prompts sent to a model, tool results returned to it, logs and product names stay English, and so do strings in `schema/plugin.json`. Python text shown to the user uses a bundle from `notebook_intelligence/i18n.py` the same way (`trans = i18n.request_bundle(self)` in a handler, `trans = i18n.response_bundle(response)` in chat code). [CONTRIBUTING.md](CONTRIBUTING.md#translations) has the details.
27
30
  - Import `react-icons` icons from `src/icons.ts`, not directly from `react-icons/vsc` or `react-icons/md`. That module re-types the icons so they compile under `@types/react` 18.
@@ -8,17 +8,60 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
8
8
 
9
9
  <!-- <START NEW CHANGELOG ENTRY> -->
10
10
 
11
- ## [6.0.0] - unreleased
11
+ ## [Unreleased]
12
+
13
+ ### Changed
14
+
15
+ - **Dependency floors raised past newly published advisories** (#518). The Python floors move to `litellm>=1.96.2`, `mcp>=1.30.0`, `urllib3>=2.8.0`, and `aiohttp>=3.14.4`, and the build requires `jupyterlab>=4.6.4`. litellm backported its fix to each minor line from 1.88 to 1.96, so 1.96.2 is the lowest floor that excludes every unpatched release. The `mcp` advisory affects only the StreamableHTTP server, which NBI does not use. npm resolutions were raised or added for `brace-expansion`, `sanitize-html`, `serialize-javascript`, `undici`, `handlebars`, `shell-quote`, and `source-map-js`; of those, only `sanitize-html` reaches the shipped bundle.
16
+
17
+ ### Fixed
18
+
19
+ - **Terminal drops reject filenames with control or misleading formatting characters.** File-browser drops and uploaded paths containing line breaks, terminal control characters, Unicode line/paragraph separators, or bidirectional formatting controls are skipped with a warning in both @-mention and raw modes. Other paths in the same drop still paste normally.
20
+ - **ACP startup no longer lets npm projects choose the adapter.** Starting an adapter through `npx` could execute a package planted in the workspace or a shared ancestor of the user's home before any approval prompt. ACP now launches a preinstalled `codex-acp` executable directly from an absolute server `PATH` directory, excluding workspace paths, aliases, and intermediate symlink hops from adapter discovery, interpreter checks, and the `PATH` inherited by agent commands. **Migration:** install the tested `@zed-industries/codex-acp@0.16.0` in a trusted location and maintain its version there; NBI does not verify versions found on `PATH` or through an override. `NBI_ACP_AGENT_COMMAND` must point to the installed adapter itself by absolute path, not `npx`, `npm exec`, `pnpm dlx`, `bunx`, or an `env` wrapper. An override preserves the executable's name for trusted shims and retains the full server `PATH`; it is an administrator trust decision covering the executable, its runtime and packages, and their parent directories. Readiness and startup use the same resolver, so relative, missing, malformed, and set-but-empty or whitespace-only commands are consistently blocked. Unset `NBI_ACP_AGENT_COMMAND` to restore default discovery; assigning an empty value does not reset it. The adapter starts in NBI's user directory, workspace sessions retain their explicit root, and the `nbi_workspace_root` MCP tool requires an explicit absolute root through an environment variable instead of falling back to the launch directory. See the [admin guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378).
21
+
22
+ ## [6.2.0] - 2026-10-05
23
+
24
+ 6.2.0 adds a way to turn an existing notebook into a Chatbook and fixes two Chatbook problems that silently dropped content: `@` mentions that lost their file, and exported code cells that lost their code. No traitlet, env var, REST route, or on-disk format was renamed or removed; upgrading needs no migration.
25
+
26
+ ### Added
27
+
28
+ - **Convert to Chatbook** (#508). Ordinary notebooks get a **Convert to Chatbook** toolbar button and a **Convert notebook to Chatbook** palette command, the reverse of **Export as code notebook**. Both write a Chatbook copy beside the original (`analysis.ipynb` becomes `analysis-chatbook.ipynb`) and open it, with every code cell arriving as a **Cd** cell that 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 stay natural language. Outputs, attachments, markdown and raw cells, and other metadata are kept. Conversion sends nothing to the model. A notebook in a different language from the configured backend kernel is not converted, and the dialog explains why. See [`docs/chatbook.md`](docs/chatbook.md#convert-a-notebook-to-a-chatbook).
29
+
30
+ ### Fixed
31
+
32
+ - **`@` mentions followed by punctuation or naming paths with spaces resolve** (#505). Punctuation typed right after a mention (`@file:data/README.md, then chart it`) became part of the path, and a path containing a space could not be written at all, so the model received the mention as unavailable and generated code anyway. Sentence punctuation after an unquoted file or folder mention is now trimmed, stopping at the first name that exists, and a quoted form (`@file:"data/my notes.md"`) names a path containing whitespace or `@`. The mention menu inserts the quoted form when it is needed.
33
+ - **Exporting keeps the code of a code cell switched to natural language** (#510). A **Cd** cell switched to **NL** and not run again was exported as a comment of its English description instead of its code. Export now writes the code when the cell's English is still the description of that exact code, or is empty on a cell that has only ever been code. English edited after the switch still exports as comments. A description written before 6.2.0 does not record which code it describes, so such a cell still exports as comments until **Refresh English representation** is run on it.
34
+
35
+ ## [6.1.0] - 2026-09-26
36
+
37
+ 6.1.0 adds a switch that turns off the first-run tour, lets NBI share an environment with `jupyter-ai`, and fixes two chat sidebar controls. No traitlet, env var, REST route, or on-disk format was renamed or removed. The `agent-client-protocol` floor moves from 0.10.1 to 0.11.0, so an environment that pins 0.10.x must lift that pin to upgrade.
38
+
39
+ ### Added
40
+
41
+ - **`NBI_TOUR_DISABLED` turns off the first-run tour** (#495). A deployment can stop the tour from opening on first run without maintaining an override file that disables every step, which broke silently whenever a release added a step. The traitlet is `NotebookIntelligence.tour_disabled`, and the environment variable takes precedence. Users can still replay the tour with **Show NBI tour**. See [`docs/admin-tour-config.md`](docs/admin-tour-config.md#turning-the-tour-off).
42
+
43
+ ### Changed
44
+
45
+ - **`agent-client-protocol` is a range instead of an exact pin** (#501). The dependency moves from `==0.10.1` to `>=0.11.0,<1`, so NBI can be installed in the same environment as `jupyter-ai`, whose ACP client requires `>=0.11.0,<0.12.0`.
46
+
47
+ ### Fixed
48
+
49
+ - **Dropdown choices are readable in dark JupyterLab themes** (#497). The chat mode select and NBI's other dropdowns showed light text on the browser's default light option list, so the choices were nearly invisible.
50
+ - **The chat sidebar's `/` and `@` popover keeps its selection visible and valid** (#499). Arrow keys moved the selection out of view on a list longer than the popover, and filtering the list could leave the selection pointing past its end, so Enter raised and the keypress was lost.
51
+
52
+ ## [6.0.0] - 2026-09-22
12
53
 
13
54
  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
55
 
15
56
  ### Added
16
57
 
17
58
  - **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).
59
+ - **Chatbook generation appears in performance diagnostics** (#488). Generation records the same `context_prep` and `dispatch` phases as a chat turn, and its `mode` is `chatbook:<provider>`, so it can be told apart from chat on the same provider.
18
60
  - **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.
19
61
 
20
62
  ### Changed
21
63
 
64
+ - **Chatbook generation asks for results that later cells can name** (#493). The generation instructions now ask the model to bind a cell's meaningful result to a descriptive variable, to avoid the kernel's implicit input and output history (`_`, `Out[n]`, `In[n]`), and, when a cell is regenerated, not to count on names defined only by the code being replaced. These are instructions to the model, not checks on the code it returns.
22
65
  - **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
66
  - **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
67
  - **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.
@@ -32,6 +75,7 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
32
75
  - **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
76
  - **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
77
  - **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.
78
+ - **Copilot is no longer signed in when nothing will use it** (#490). A Claude-only deployment logged into GitHub Copilot at startup, refreshed its token, and polled `api.github.com` for the life of the server, because both model fields default to Copilot. NBI now signs in only when Copilot will serve chat or autocomplete, so Claude chat with Copilot autocomplete still works. Turning "remember login" off still deletes a stored token.
35
79
  - **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
80
  - **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
81
  - **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.
@@ -40,7 +84,7 @@ For each release we list user-facing changes grouped as **Added**, **Changed**,
40
84
  - **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
85
  - **`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
86
  - **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.
87
+ - **Chatbook fixes** (#457, #458, #487). 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. Rules scoped with `kernel_names` are matched against the backend kernel the generated code runs in rather than the `chatbook` wrapper, so a rule naming `python3` now applies to a Python Chatbook. A rule naming `kernel_names: ['chatbook']`, written during the 6.0.0 prereleases, no longer matches; put Chatbook-only rules under `modes/chatbook/` instead (see [`docs/rulesets.md`](docs/rulesets.md)).
44
88
  - **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
89
 
46
90
  ## [5.4.0] - 2026-09-01
@@ -496,7 +540,9 @@ A multi-PR accessibility pass landed across most NBI surfaces. Together these ma
496
540
  - Settings UI restructured around Claude vs default mode.
497
541
  - WebSocket connection reliability improvements.
498
542
 
499
- [unreleased]: https://github.com/plmbr/notebook-intelligence/compare/v6.0.0...HEAD
543
+ [unreleased]: https://github.com/plmbr/notebook-intelligence/compare/v6.2.0...HEAD
544
+ [6.2.0]: https://github.com/plmbr/notebook-intelligence/compare/v6.1.0...v6.2.0
545
+ [6.1.0]: https://github.com/plmbr/notebook-intelligence/compare/v6.0.0...v6.1.0
500
546
  [6.0.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.4.0...v6.0.0
501
547
  [5.4.0]: https://github.com/plmbr/notebook-intelligence/compare/v5.3.1...v5.4.0
502
548
  [5.3.1]: https://github.com/plmbr/notebook-intelligence/compare/v5.3.0...v5.3.1
@@ -201,6 +201,63 @@ If `jlpm install` produces unexpected lockfile changes, your local Yarn version
201
201
 
202
202
  If you work with a coding agent, [AGENTS.md](AGENTS.md) holds these `jlpm` and lockfile rules in a form agents pick up automatically.
203
203
 
204
+ ## Translations
205
+
206
+ Translators: see [docs/translating.md](docs/translating.md). NBI's user interface is translated through JupyterLab's own translation system, so it follows the language a user picks under **Settings → Language** (which lists the JupyterLab language packs installed on the server). The gettext domain is `notebook_intelligence`. Catalogs live in the package:
207
+
208
+ - `notebook_intelligence/locale/notebook_intelligence.pot` is the template of every translatable string. It is generated; do not edit it by hand.
209
+ - `notebook_intelligence/locale/<locale>/LC_MESSAGES/notebook_intelligence.po` is one language, for example `de_DE`. These are the only catalog files translators edit.
210
+ - The `.json` bundle the frontend loads and the `.mo` file the server reads are compiled from each `.po` when a wheel is built (`hatch_build.py`) and are not committed. The `jupyterlab.locale` entry point in `pyproject.toml` is how `jupyterlab_server` finds it.
211
+ - Strings in `schema/plugin.json` stay English: `jupyterlab_server` translates settings schemas only from JupyterLab language packs, never from an extension's own catalog. Put user-visible text on the command instead (a toolbar button's tooltip falls back to its command's label and caption).
212
+
213
+ ### Writing translatable strings
214
+
215
+ In TypeScript, take the bundle where the string is used and name the local `trans`, because the extractor only recognizes calls on a variable with that name:
216
+
217
+ ```ts
218
+ import { getTrans, useTrans } from './i18n';
219
+
220
+ const trans = getTrans(); // in a React component: const trans = useTrans();
221
+ Notification.error(trans.__('Failed to save %1', path));
222
+ trans._n('%1 file', '%1 files', count); // plurals; %1 is the count
223
+ trans._p('toolbar', 'Run'); // a short label whose meaning depends on context
224
+ ```
225
+
226
+ - Never build a sentence from pieces (`'Failed to ' + verb`) or with a template literal. Write the whole sentence with `%1`, `%2` placeholders so a translator can reorder it.
227
+ - Never translate at module load (a top-level `const LABEL = trans.__(...)`): the bundle is bound when the plugin activates, so such a string stays English.
228
+ - Keep markup out of translated strings. For a sentence with a link or other element inside it, use `interpolate` from `src/i18n.ts`, which translates the whole sentence and places the elements at its `%1`, `%2` placeholders, so a translator can reorder them.
229
+ - Give short labels whose meaning depends on where they appear a context with `trans._p` (`trans._p('permission mode', 'Plan')`), so a translator can choose a different word for each use.
230
+ - Pass string literals only. The extractor skips any other argument (a variable, a template literal), so the string would never be translated; a lint rule enforces this.
231
+ - Leave in English anything that is not shown to the user as prose: prompts and instructions sent to a model, results that UI tools return to the model, log and console messages, telemetry, command ids, and configuration values. Product names (Notebook Intelligence, Claude Code, Codex) are not translated. Neither is text that styling or code matches on, such as the launcher category `Coding Agent`, which `style/base.css` pins to the top of the launcher.
232
+
233
+ The server translates text it writes for the user (the readiness report, approval cards, chat status lines, built-in toolset descriptions, user-facing REST errors) from the same catalogs, in the language each request names: `src/handler.ts` adds an `nbi_locale` query parameter to REST calls and the chat WebSocket (`withLocale`). Not a header, which would need a CORS preflight that jupyter_server refuses. As in the frontend, a locale is translated only when a JupyterLab language pack for it is installed. The same rules apply, with a bundle from `notebook_intelligence/i18n.py`, again in a local named `trans`:
234
+
235
+ ```python
236
+ from notebook_intelligence import i18n
237
+
238
+ trans = i18n.request_bundle(self) # in a REST handler
239
+ trans = i18n.response_bundle(response) # in chat code
240
+ trans.__("Skill '%1' not found in %2 scope", name, scope)
241
+ ```
242
+
243
+ `scripts/i18n.py` refuses a `trans` call whose msgid is not a string literal (an f-string, a variable), or one made through an attribute (`self.trans.__`). Text returned to the model or an agent CLI, log messages and exception text stay English.
244
+
245
+ In Jest, `tests/ts/pseudo-translator.ts` provides a bundle that wraps every string in `[!! … !!]`. Bind it with `initTranslations(pseudoTranslator)`, or provide it to components through `TranslationContext`, to check that a string goes through `trans`.
246
+
247
+ ### Updating catalogs
248
+
249
+ The tooling needs the `i18n` extra (`pip install -e ".[i18n]"`) and Node.js:
250
+
251
+ ```bash
252
+ jlpm i18n:extract # regenerate the .pot after changing strings
253
+ jlpm i18n:update # merge it into every .po
254
+ jlpm i18n:update -l ca_ES # start a new language
255
+ jlpm i18n:compile # build the .json bundles locally to try a catalog
256
+ jlpm i18n:check # what CI runs: fails when the .pot is out of date
257
+ ```
258
+
259
+ To try a catalog, compile it, reinstall the package (`pip install -e .`) so the entry point is registered, install the matching JupyterLab language pack (for example `pip install jupyterlab-language-pack-de-DE`), and choose the language under **Settings → Language**. A string missing from a catalog falls back to English.
260
+
204
261
  ## Packaging
205
262
 
206
263
  See [RELEASE.md](RELEASE.md).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: notebook_intelligence
3
- Version: 6.2.0
3
+ Version: 6.3.0a1
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,15 +695,15 @@ 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<1,>=0.11.0
698
- Requires-Dist: aiohttp>=3.14.3
698
+ Requires-Dist: aiohttp>=3.14.4
699
699
  Requires-Dist: anthropic>=0.22.1
700
700
  Requires-Dist: claude-agent-sdk
701
701
  Requires-Dist: cryptography>=50.0.0
702
702
  Requires-Dist: fuzy-jon==0.1.0
703
703
  Requires-Dist: ipykernel>=6.0
704
704
  Requires-Dist: jupyter-server<3,>=2.21.0
705
- Requires-Dist: litellm>=1.84.0
706
- Requires-Dist: mcp<2,>=1.28.1
705
+ Requires-Dist: litellm>=1.96.2
706
+ Requires-Dist: mcp<2,>=1.30.0
707
707
  Requires-Dist: mistune>=3.3.3
708
708
  Requires-Dist: ollama
709
709
  Requires-Dist: openai
@@ -715,8 +715,11 @@ Requires-Dist: sseclient-py
715
715
  Requires-Dist: starlette>=1.3.1
716
716
  Requires-Dist: tiktoken
717
717
  Requires-Dist: tornado>=6.5.10
718
- Requires-Dist: urllib3>=2.7.0
718
+ Requires-Dist: urllib3>=2.8.0
719
+ Provides-Extra: i18n
720
+ Requires-Dist: jupyterlab-translate<2,>=1.3.7; extra == 'i18n'
719
721
  Provides-Extra: test
722
+ Requires-Dist: polib>=1.2; extra == 'test'
720
723
  Requires-Dist: psutil; extra == 'test'
721
724
  Requires-Dist: pytest-timeout>=2.3.0; extra == 'test'
722
725
  Requires-Dist: pytest<10,>=9.0.3; extra == 'test'
@@ -746,6 +749,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
746
749
  - [Notebook toolbar generation](#notebook-toolbar-generation)
747
750
  - [Multi-language and kernel-aware notebooks](#multi-language-and-kernel-aware-notebooks)
748
751
  - [Reload open files when changed on disk](#reload-open-files-when-changed-on-disk)
752
+ - [Replies in your language](#replies-in-your-language)
749
753
  - [Configuration](#configuration)
750
754
  - [Configuration files](#configuration-files)
751
755
  - [Remembering GitHub Copilot login](#remembering-github-copilot-login)
@@ -768,7 +772,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
768
772
 
769
773
  - Python 3.10+
770
774
  - JupyterLab 4.x
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`.
775
+ - Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for the preinstalled `codex-acp` adapter used by [ACP agent mode](#acp-agent-mode), and for MCP servers that launch via `npx`. ACP mode requires a preinstalled adapter in a trusted location; NBI does not download it at startup.
772
776
  - A fresh virtualenv or conda env is recommended so NBI doesn't conflict with system Python.
773
777
 
774
778
  ## Quick start
@@ -889,7 +893,7 @@ A Chatbook is a notebook whose cells can be written in English. Running a prompt
889
893
 
890
894
  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
895
 
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).
896
+ 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, a Chatbook exports to a plain code notebook when you want to hand someone the result instead of the prompts, and an existing notebook converts to a Chatbook. See [`docs/chatbook.md`](docs/chatbook.md).
893
897
 
894
898
  ### Code generation with inline chat
895
899
 
@@ -937,6 +941,10 @@ When the agent needs a notebook in a language the current context has not establ
937
941
 
938
942
  NBI reloads open document tabs when their files change on disk, so edits an AI agent makes via its Read/Write tools appear in the editor without a manual refresh. Tabs with unsaved local edits are skipped so user work is never clobbered. Toggle via the **NBI Settings dialog → External changes → "Refresh open files when changed on disk"** (default on).
939
943
 
944
+ ### Replies in your language
945
+
946
+ When JupyterLab is set to another language through a language pack, turn on **NBI Settings dialog → Language → "Reply in my JupyterLab language"** (default off) to have the AI write its chat replies and Chatbook cell descriptions in that language, in every chat mode (the configured provider, Claude, and ACP agents). Code, identifiers, file names and file contents are left as they are. The language is sent to the model by the English name of its JupyterLab language pack ("German (Germany)"), and while JupyterLab is in English, or the setting is off, prompts are unchanged. In Claude and ACP mode the instruction goes with each message rather than a slash command, and a conversation keeps following it after the setting is turned off until you start a new chat.
947
+
940
948
  ## Configuration
941
949
 
942
950
  Configure your provider, model, and API key from NBI Settings — the gear icon in the chat panel, the `/settings` chat command, or the JupyterLab command palette. For background, see the [provider blog post](https://nbi.plmbr.dev/blog/archive/support-for-any-llm-provider/).
@@ -1017,7 +1025,9 @@ Per-user preferences (default on for the cell-output features) live in `config.j
1017
1025
 
1018
1026
  Inline chat calls the Anthropic API directly while the other Claude modes go through the Claude Code CLI, so a deployment can need a different model id for each. It uses `inline_chat_model`, falling back to `chat_model` when that is unset. `NBI_CLAUDE_CHAT_MODEL` therefore governs both surfaces: while it is set, a stored `inline_chat_model` is ignored and its control is disabled. Set `NBI_CLAUDE_INLINE_CHAT_MODEL` as well to pin inline chat to a different model — it takes precedence and re-enables nothing, so both surfaces stay administrator-controlled.
1019
1027
 
1020
- `NBI_ACP_AGENT_COMMAND` (not a settings lock) overrides the adapter command NBI launches for the selected ACP agent type; the value is shell-split. For Codex, NBI appends its `-c` approval and sandbox options to that command, so a replacement must pass them through to codex-acp. Leave it unset to use the agent's registered default command.
1028
+ `NBI_ACP_AGENT_COMMAND` (not a settings lock) selects an installed adapter by absolute executable path, for example `/opt/nbi/acp/bin/codex-acp`; the value is shell-split, so quote paths containing spaces. Point it at the installed adapter itself, not `npx`, `npm exec`, `pnpm dlx`, `bunx`, or an `env` wrapper: making a package runner's path absolute does not prevent it from selecting code from a project. For Codex, the adapter must honor the `-c` approval and sandbox options NBI appends. An override is an administrator trust decision covering the command, its runtime and packages, inherited `PATH`, and their parent directories.
1029
+
1030
+ Leave the override unset to discover a preinstalled `codex-acp` in an absolute server `PATH` directory outside the Jupyter workspace. Empty or whitespace-only values are errors; use `unset NBI_ACP_AGENT_COMMAND` in a POSIX shell to restore default discovery. NBI follows symlinks before launching it; installations using a shim that depends on the name `codex-acp` need an explicit absolute path to that trusted shim. Default startup removes workspace directories from the `PATH` inherited by the agent and its commands, which can exclude a project's `.venv/bin`; an explicit override retains the full server `PATH`. Install the tested `@zed-industries/codex-acp@0.16.0` and maintain that version yourself: NBI does not verify or update versions for either discovery method. See the [adapter installation and migration guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378) for a concrete install command, home-directory workspace layouts, and the explicit adapter-path requirement for Windows with Python 3.10 or 3.11.
1021
1031
 
1022
1032
  Provider IDs: `github-copilot`, `openai-compatible`, `litellm-compatible`, `ollama`, `none`. The `*_MODEL_ID` value is whatever the chosen provider exposes (e.g. `gpt-4o`, `llama3:latest`). Claude model IDs are the literal IDs from the Anthropic API (e.g. `claude-opus-4-7`, `claude-sonnet-4-6`); empty string = "Default (recommended)"; `NBI_CLAUDE_INLINE_COMPLETION_MODEL` also accepts `none` (no inline completion in Claude mode) or `inherit` (use the General-tab Auto-complete model).
1023
1033
 
@@ -1195,7 +1205,7 @@ c.NotebookIntelligence.enable_chat_feedback_always_visible = True
1195
1205
 
1196
1206
  NBI Settings opens on a **Status** card that answers one question: is this deployment configured to work, and if not, which specific piece is missing? Each check reports `ok`, `warn`, or `blocked`, and anything that is not `ok` carries the next action rather than just the failure ("the claude CLI was not found" plus "install it, or set `NBI_CLAUDE_CLI_PATH` and restart").
1197
1207
 
1198
- It runs on open and costs nothing: it resolves your provider and model, checks the model list is reachable and that your selected model is one the endpoint actually serves, and for the agent modes checks that the CLI answers `--version` and that credentials are present. A missing key is a warning rather than an error, because the Claude CLI and ACP agents can hold their own subscription logins that NBI cannot see.
1208
+ It runs on open and costs nothing: it resolves your provider and model, checks the model list is reachable and that your selected model is one the endpoint actually serves, checks the Claude CLI with `--version`, and checks ACP's adapter executable without running it. Both agent modes also check whether credentials are present. A missing key is a warning rather than an error, because the Claude CLI and ACP agents can hold their own subscription logins that NBI cannot see.
1199
1209
 
1200
1210
  **Test the endpoint** sends one short request to your configured model, after asking first. It is the only way to catch two failures nothing cheaper can see: a gateway that returns 200s but buffers instead of streaming, and a proxy that strips the `tools` field so agent mode silently never calls a tool. No model output is kept, so the result is safe to paste into a support ticket.
1201
1211
 
@@ -1230,10 +1240,11 @@ Full guide, including the span and event reference, the probe thresholds, worked
1230
1240
  - [`docs/skills.md`](docs/skills.md) — Claude Skills management and the org-manifest reconciler.
1231
1241
  - [`docs/rulesets.md`](docs/rulesets.md) — ruleset frontmatter and discovery.
1232
1242
  - [`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.
1243
+ - [`docs/chatbook.md`](docs/chatbook.md): writing Chatbook cells, execution modes, conversion and export, and why there is no per-cell sandbox.
1234
1244
  - [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md) — dynamic Chatbook context and mention providers.
1235
1245
  - [`docs/troubleshooting.md`](docs/troubleshooting.md) — common problems with copy-pasteable fixes.
1236
1246
  - [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md): turn timelines, the environment probe, and how to read both.
1247
+ - [`docs/translating.md`](docs/translating.md): using NBI in your language, and fixing or adding a translation.
1237
1248
  - [`PRIVACY.md`](PRIVACY.md) — what NBI sends to which provider, and the egress allowlist.
1238
1249
  - [`SECURITY.md`](SECURITY.md) — how to report a vulnerability.
1239
1250
  - [`CHANGELOG.md`](CHANGELOG.md) — release history.
@@ -1248,7 +1259,7 @@ Full guide, including the span and event reference, the probe thresholds, worked
1248
1259
 
1249
1260
  ## Roadmap
1250
1261
 
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.
1262
+ 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 marks Chatbook's arrival, and no traitlet, env var, REST route, or on-disk format was renamed or removed. Deployments using the experimental ACP mode must now preinstall its adapter; see the [migration guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378). Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note-1) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
1252
1263
 
1253
1264
  ## License
1254
1265
 
@@ -29,19 +29,19 @@ If your cells contain sensitive outputs (PHI, PII, secrets), clear them before i
29
29
 
30
30
  Hosts NBI may contact, depending on which features are enabled:
31
31
 
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 |
43
-
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.
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` |
43
+
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. ACP uses a preinstalled adapter; NBI does not fetch it from npm at startup. 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.
45
45
 
46
46
  For air-gapped or egress-restricted environments, see [`docs/admin-guide.md`](docs/admin-guide.md#air-gap-deployment).
47
47
 
@@ -21,6 +21,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
21
21
  - [Notebook toolbar generation](#notebook-toolbar-generation)
22
22
  - [Multi-language and kernel-aware notebooks](#multi-language-and-kernel-aware-notebooks)
23
23
  - [Reload open files when changed on disk](#reload-open-files-when-changed-on-disk)
24
+ - [Replies in your language](#replies-in-your-language)
24
25
  - [Configuration](#configuration)
25
26
  - [Configuration files](#configuration-files)
26
27
  - [Remembering GitHub Copilot login](#remembering-github-copilot-login)
@@ -43,7 +44,7 @@ NBI is free and open-source. Connect it to a free or paid LLM provider of your c
43
44
 
44
45
  - Python 3.10+
45
46
  - JupyterLab 4.x
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`.
47
+ - Node.js — required for [Claude mode](#claude-mode) (the Claude Code CLI), for the preinstalled `codex-acp` adapter used by [ACP agent mode](#acp-agent-mode), and for MCP servers that launch via `npx`. ACP mode requires a preinstalled adapter in a trusted location; NBI does not download it at startup.
47
48
  - A fresh virtualenv or conda env is recommended so NBI doesn't conflict with system Python.
48
49
 
49
50
  ## Quick start
@@ -164,7 +165,7 @@ A Chatbook is a notebook whose cells can be written in English. Running a prompt
164
165
 
165
166
  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
 
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
+ 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, a Chatbook exports to a plain code notebook when you want to hand someone the result instead of the prompts, and an existing notebook converts to a Chatbook. See [`docs/chatbook.md`](docs/chatbook.md).
168
169
 
169
170
  ### Code generation with inline chat
170
171
 
@@ -212,6 +213,10 @@ When the agent needs a notebook in a language the current context has not establ
212
213
 
213
214
  NBI reloads open document tabs when their files change on disk, so edits an AI agent makes via its Read/Write tools appear in the editor without a manual refresh. Tabs with unsaved local edits are skipped so user work is never clobbered. Toggle via the **NBI Settings dialog → External changes → "Refresh open files when changed on disk"** (default on).
214
215
 
216
+ ### Replies in your language
217
+
218
+ When JupyterLab is set to another language through a language pack, turn on **NBI Settings dialog → Language → "Reply in my JupyterLab language"** (default off) to have the AI write its chat replies and Chatbook cell descriptions in that language, in every chat mode (the configured provider, Claude, and ACP agents). Code, identifiers, file names and file contents are left as they are. The language is sent to the model by the English name of its JupyterLab language pack ("German (Germany)"), and while JupyterLab is in English, or the setting is off, prompts are unchanged. In Claude and ACP mode the instruction goes with each message rather than a slash command, and a conversation keeps following it after the setting is turned off until you start a new chat.
219
+
215
220
  ## Configuration
216
221
 
217
222
  Configure your provider, model, and API key from NBI Settings — the gear icon in the chat panel, the `/settings` chat command, or the JupyterLab command palette. For background, see the [provider blog post](https://nbi.plmbr.dev/blog/archive/support-for-any-llm-provider/).
@@ -292,7 +297,9 @@ Per-user preferences (default on for the cell-output features) live in `config.j
292
297
 
293
298
  Inline chat calls the Anthropic API directly while the other Claude modes go through the Claude Code CLI, so a deployment can need a different model id for each. It uses `inline_chat_model`, falling back to `chat_model` when that is unset. `NBI_CLAUDE_CHAT_MODEL` therefore governs both surfaces: while it is set, a stored `inline_chat_model` is ignored and its control is disabled. Set `NBI_CLAUDE_INLINE_CHAT_MODEL` as well to pin inline chat to a different model — it takes precedence and re-enables nothing, so both surfaces stay administrator-controlled.
294
299
 
295
- `NBI_ACP_AGENT_COMMAND` (not a settings lock) overrides the adapter command NBI launches for the selected ACP agent type; the value is shell-split. For Codex, NBI appends its `-c` approval and sandbox options to that command, so a replacement must pass them through to codex-acp. Leave it unset to use the agent's registered default command.
300
+ `NBI_ACP_AGENT_COMMAND` (not a settings lock) selects an installed adapter by absolute executable path, for example `/opt/nbi/acp/bin/codex-acp`; the value is shell-split, so quote paths containing spaces. Point it at the installed adapter itself, not `npx`, `npm exec`, `pnpm dlx`, `bunx`, or an `env` wrapper: making a package runner's path absolute does not prevent it from selecting code from a project. For Codex, the adapter must honor the `-c` approval and sandbox options NBI appends. An override is an administrator trust decision covering the command, its runtime and packages, inherited `PATH`, and their parent directories.
301
+
302
+ Leave the override unset to discover a preinstalled `codex-acp` in an absolute server `PATH` directory outside the Jupyter workspace. Empty or whitespace-only values are errors; use `unset NBI_ACP_AGENT_COMMAND` in a POSIX shell to restore default discovery. NBI follows symlinks before launching it; installations using a shim that depends on the name `codex-acp` need an explicit absolute path to that trusted shim. Default startup removes workspace directories from the `PATH` inherited by the agent and its commands, which can exclude a project's `.venv/bin`; an explicit override retains the full server `PATH`. Install the tested `@zed-industries/codex-acp@0.16.0` and maintain that version yourself: NBI does not verify or update versions for either discovery method. See the [adapter installation and migration guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378) for a concrete install command, home-directory workspace layouts, and the explicit adapter-path requirement for Windows with Python 3.10 or 3.11.
296
303
 
297
304
  Provider IDs: `github-copilot`, `openai-compatible`, `litellm-compatible`, `ollama`, `none`. The `*_MODEL_ID` value is whatever the chosen provider exposes (e.g. `gpt-4o`, `llama3:latest`). Claude model IDs are the literal IDs from the Anthropic API (e.g. `claude-opus-4-7`, `claude-sonnet-4-6`); empty string = "Default (recommended)"; `NBI_CLAUDE_INLINE_COMPLETION_MODEL` also accepts `none` (no inline completion in Claude mode) or `inherit` (use the General-tab Auto-complete model).
298
305
 
@@ -470,7 +477,7 @@ c.NotebookIntelligence.enable_chat_feedback_always_visible = True
470
477
 
471
478
  NBI Settings opens on a **Status** card that answers one question: is this deployment configured to work, and if not, which specific piece is missing? Each check reports `ok`, `warn`, or `blocked`, and anything that is not `ok` carries the next action rather than just the failure ("the claude CLI was not found" plus "install it, or set `NBI_CLAUDE_CLI_PATH` and restart").
472
479
 
473
- It runs on open and costs nothing: it resolves your provider and model, checks the model list is reachable and that your selected model is one the endpoint actually serves, and for the agent modes checks that the CLI answers `--version` and that credentials are present. A missing key is a warning rather than an error, because the Claude CLI and ACP agents can hold their own subscription logins that NBI cannot see.
480
+ It runs on open and costs nothing: it resolves your provider and model, checks the model list is reachable and that your selected model is one the endpoint actually serves, checks the Claude CLI with `--version`, and checks ACP's adapter executable without running it. Both agent modes also check whether credentials are present. A missing key is a warning rather than an error, because the Claude CLI and ACP agents can hold their own subscription logins that NBI cannot see.
474
481
 
475
482
  **Test the endpoint** sends one short request to your configured model, after asking first. It is the only way to catch two failures nothing cheaper can see: a gateway that returns 200s but buffers instead of streaming, and a proxy that strips the `tools` field so agent mode silently never calls a tool. No model output is kept, so the result is safe to paste into a support ticket.
476
483
 
@@ -505,10 +512,11 @@ Full guide, including the span and event reference, the probe thresholds, worked
505
512
  - [`docs/skills.md`](docs/skills.md) — Claude Skills management and the org-manifest reconciler.
506
513
  - [`docs/rulesets.md`](docs/rulesets.md) — ruleset frontmatter and discovery.
507
514
  - [`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.
515
+ - [`docs/chatbook.md`](docs/chatbook.md): writing Chatbook cells, execution modes, conversion and export, and why there is no per-cell sandbox.
509
516
  - [`docs/chatbook-extensions.md`](docs/chatbook-extensions.md) — dynamic Chatbook context and mention providers.
510
517
  - [`docs/troubleshooting.md`](docs/troubleshooting.md) — common problems with copy-pasteable fixes.
511
518
  - [`docs/performance-diagnostics.md`](docs/performance-diagnostics.md): turn timelines, the environment probe, and how to read both.
519
+ - [`docs/translating.md`](docs/translating.md): using NBI in your language, and fixing or adding a translation.
512
520
  - [`PRIVACY.md`](PRIVACY.md) — what NBI sends to which provider, and the egress allowlist.
513
521
  - [`SECURITY.md`](SECURITY.md) — how to report a vulnerability.
514
522
  - [`CHANGELOG.md`](CHANGELOG.md) — release history.
@@ -523,7 +531,7 @@ Full guide, including the span and event reference, the probe thresholds, worked
523
531
 
524
532
  ## Roadmap
525
533
 
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.
534
+ 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 marks Chatbook's arrival, and no traitlet, env var, REST route, or on-disk format was renamed or removed. Deployments using the experimental ACP mode must now preinstall its adapter; see the [migration guidance](docs/admin-guide.md#gating-the-experimental-acp-agent-378). Upgrading from 4.x? See the [5.0.0 migration note](CHANGELOG.md#migration-note-1) for the `fastmcp` → `mcp` dependency swap, the new path sandboxes, and the workspace-file-attach behavior change.
527
535
 
528
536
  ## License
529
537
 
@@ -10,7 +10,7 @@ For the admin side of this feature (the two policies, the approval posture NBI p
10
10
 
11
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
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.
13
+ With the tab visible, pick the agent type, then set the chat model, API key, and base URL. An administrator must first install the tested `@zed-industries/codex-acp@0.16.0` in a trusted location outside the Jupyter workspace. NBI finds its `codex-acp` executable through absolute directories on the server's `PATH`, or uses an absolute path to the installed adapter configured through `NBI_ACP_AGENT_COMMAND`. Do not use package runners such as `npx`, `npm exec`, `pnpm dlx`, or `bunx`, or an `env` wrapper, for that override. NBI does not download an adapter at startup or verify its version; the administrator maintains the installation. Settings → Status reports a missing or invalid adapter command or declared script interpreter. See the [installation and migration guidance](admin-guide.md#gating-the-experimental-acp-agent-378), including a concrete install command, home-directory workspace layouts, and the requirements for shims and Windows with Python 3.10 or 3.11. Empty or whitespace-only `NBI_ACP_AGENT_COMMAND` values are invalid; unset the variable to restore default discovery.
14
14
 
15
15
  ## What a turn looks like
16
16
 
@@ -22,7 +22,8 @@ Previous sessions are listed by the history control, and picking one resumes it
22
22
 
23
23
  ## Limits worth knowing
24
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.
25
+ - **Agent commands use a filtered `PATH` by default.** Workspace directories, including a project's `.venv/bin`, are removed. Commands such as `python` or `pytest` may therefore select another installation or be unavailable. An administrator's explicit adapter override retains the full server `PATH` and requires trusting its contents.
26
+ - **Startup is bounded.** An agent has 60 seconds to spawn, initialize, authenticate, and create a session. If this takes too long, the failure reads `ACP agent did not start in time`. Check the adapter installation and authentication before retrying.
26
27
  - **A turn is capped at 30 minutes**, after which it fails with an agent response timeout.
27
28
  - **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
29
  - **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.