@google/gemini-cli 0.23.0-preview.3 → 0.24.0-nightly.20251227.37be16243

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 (108) hide show
  1. package/dist/google-gemini-cli-0.24.0-nightly.20251226.546baf993.tgz +0 -0
  2. package/dist/package.json +2 -2
  3. package/dist/src/commands/extensions/install.js +7 -31
  4. package/dist/src/commands/extensions/install.js.map +1 -1
  5. package/dist/src/commands/extensions/install.test.js +21 -3
  6. package/dist/src/commands/extensions/install.test.js.map +1 -1
  7. package/dist/src/commands/extensions/validate.test.js +1 -1
  8. package/dist/src/commands/extensions/validate.test.js.map +1 -1
  9. package/dist/src/commands/mcp/list.js +7 -1
  10. package/dist/src/commands/mcp/list.js.map +1 -1
  11. package/dist/src/config/config.d.ts +10 -2
  12. package/dist/src/config/config.js +10 -2
  13. package/dist/src/config/config.js.map +1 -1
  14. package/dist/src/config/config.test.js +2 -4
  15. package/dist/src/config/config.test.js.map +1 -1
  16. package/dist/src/config/extension-manager.d.ts +6 -0
  17. package/dist/src/config/extension-manager.js +34 -2
  18. package/dist/src/config/extension-manager.js.map +1 -1
  19. package/dist/src/config/policy-engine.integration.test.js +13 -1
  20. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  21. package/dist/src/config/settings-validation.js +1 -1
  22. package/dist/src/config/settings-validation.js.map +1 -1
  23. package/dist/src/config/settings-validation.test.js +49 -1
  24. package/dist/src/config/settings-validation.test.js.map +1 -1
  25. package/dist/src/config/settings.d.ts +4 -1
  26. package/dist/src/config/settings.js +23 -10
  27. package/dist/src/config/settings.js.map +1 -1
  28. package/dist/src/config/settingsSchema.d.ts +53 -0
  29. package/dist/src/config/settingsSchema.js +55 -1
  30. package/dist/src/config/settingsSchema.js.map +1 -1
  31. package/dist/src/config/settings_validation_warning.test.d.ts +6 -0
  32. package/dist/src/config/settings_validation_warning.test.js +118 -0
  33. package/dist/src/config/settings_validation_warning.test.js.map +1 -0
  34. package/dist/src/config/trustedFolders.js.map +1 -1
  35. package/dist/src/gemini.js +13 -2
  36. package/dist/src/gemini.js.map +1 -1
  37. package/dist/src/gemini.test.js +12 -0
  38. package/dist/src/gemini.test.js.map +1 -1
  39. package/dist/src/gemini_cleanup.test.js +2 -0
  40. package/dist/src/gemini_cleanup.test.js.map +1 -1
  41. package/dist/src/generated/git-commit.d.ts +2 -2
  42. package/dist/src/generated/git-commit.js +2 -2
  43. package/dist/src/generated/git-commit.js.map +1 -1
  44. package/dist/src/ui/AppContainer.js +3 -4
  45. package/dist/src/ui/AppContainer.js.map +1 -1
  46. package/dist/src/ui/commands/extensionsCommand.js +103 -2
  47. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  48. package/dist/src/ui/commands/extensionsCommand.test.js +127 -4
  49. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  50. package/dist/src/ui/components/InputPrompt.js +17 -9
  51. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  52. package/dist/src/ui/components/InputPrompt.test.js +36 -0
  53. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  54. package/dist/src/ui/components/ModelDialog.js +1 -1
  55. package/dist/src/ui/components/ModelDialog.js.map +1 -1
  56. package/dist/src/ui/components/ModelDialog.test.js +1 -0
  57. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  58. package/dist/src/ui/components/shared/text-buffer.d.ts +36 -0
  59. package/dist/src/ui/components/shared/text-buffer.js +197 -22
  60. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  61. package/dist/src/ui/components/shared/text-buffer.test.js +147 -1
  62. package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
  63. package/dist/src/ui/components/shared/vim-buffer-actions.test.js +3 -0
  64. package/dist/src/ui/components/shared/vim-buffer-actions.test.js.map +1 -1
  65. package/dist/src/ui/components/views/HooksList.js +17 -23
  66. package/dist/src/ui/components/views/HooksList.js.map +1 -1
  67. package/dist/src/ui/components/views/McpStatus.js +7 -2
  68. package/dist/src/ui/components/views/McpStatus.js.map +1 -1
  69. package/dist/src/ui/components/views/McpStatus.test.js +10 -0
  70. package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
  71. package/dist/src/ui/constants.d.ts +1 -0
  72. package/dist/src/ui/constants.js +2 -0
  73. package/dist/src/ui/constants.js.map +1 -1
  74. package/dist/src/ui/hooks/useQuotaAndFallback.js +3 -2
  75. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  76. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +9 -0
  77. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  78. package/dist/src/ui/hooks/vim.test.js +7 -0
  79. package/dist/src/ui/hooks/vim.test.js.map +1 -1
  80. package/dist/src/ui/utils/highlight.d.ts +3 -2
  81. package/dist/src/ui/utils/highlight.js +46 -36
  82. package/dist/src/ui/utils/highlight.js.map +1 -1
  83. package/dist/src/ui/utils/highlight.test.js +75 -0
  84. package/dist/src/ui/utils/highlight.test.js.map +1 -1
  85. package/dist/src/ui/utils/terminalCapabilityManager.d.ts +7 -0
  86. package/dist/src/ui/utils/terminalCapabilityManager.js +49 -1
  87. package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -1
  88. package/dist/src/ui/utils/terminalCapabilityManager.test.js +71 -0
  89. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +1 -1
  90. package/dist/src/utils/readStdin.js +7 -0
  91. package/dist/src/utils/readStdin.js.map +1 -1
  92. package/dist/src/utils/readStdin.test.js +4 -0
  93. package/dist/src/utils/readStdin.test.js.map +1 -1
  94. package/dist/src/utils/readStdin_safety.test.d.ts +6 -0
  95. package/dist/src/utils/readStdin_safety.test.js +68 -0
  96. package/dist/src/utils/readStdin_safety.test.js.map +1 -0
  97. package/dist/src/utils/sessionUtils.d.ts +20 -0
  98. package/dist/src/utils/sessionUtils.js +32 -4
  99. package/dist/src/utils/sessionUtils.js.map +1 -1
  100. package/dist/src/utils/sessionUtils.test.js +3 -3
  101. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  102. package/dist/src/zed-integration/zedIntegration.js +3 -3
  103. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  104. package/dist/src/zed-integration/zedIntegration.test.js +1 -1
  105. package/dist/src/zed-integration/zedIntegration.test.js.map +1 -1
  106. package/dist/tsconfig.tsbuildinfo +1 -1
  107. package/package.json +3 -3
  108. package/dist/google-gemini-cli-0.23.0-preview.2.tgz +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ModelDialog.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelDialog.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ModelDialog.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelDialog.tsx"],"names":[],"mappings":"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"}
@@ -58,6 +58,7 @@ describe('<ModelDialog />', () => {
58
58
  it('renders the initial "main" view correctly', () => {
59
59
  const { lastFrame } = renderComponent();
60
60
  expect(lastFrame()).toContain('Select Model');
61
+ expect(lastFrame()).toContain('Applies to this session and future Gemini CLI sessions.');
61
62
  expect(lastFrame()).toContain('Auto');
62
63
  expect(lastFrame()).toContain('Manual');
63
64
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ModelDialog.test.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelDialog.test.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,+BAA+B,EAC/B,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAGjC,oBAAoB;AACpB,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACrC,MAAM,wBAAwB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACzC,MAAM,0BAA0B,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAE3C,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;IAC5C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAChE,OAAO;QACL,GAAG,MAAM;QACT,gBAAgB,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAC5D,oBAAoB,EAAE,CAAC,MAAc,EAAE,KAA6B,EAAE,EAAE,CACtE,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC;QACzC,sBAAsB,EAAE;YACtB,YAAY,KAAa;gBACvB,0BAA0B,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;SACF;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC7B,MAAM,sBAAsB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC5B,MAAM,8BAA8B,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAS/C,MAAM,UAAU,GAAe;QAC7B,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,YAAY;QACtB,kBAAkB,EAAE,sBAAsB;QAC1C,0BAA0B,EAAE,8BAA8B;KAC3D,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,YAAY,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACxD,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9C,8BAA8B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEtD,8CAA8C;QAC9C,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,GAAW,EAAE,EAAE;YACtD,IAAI,GAAG,KAAK,iBAAiB;gBAAE,OAAO,mBAAmB,CAAC;YAC1D,IAAI,GAAG,KAAK,eAAe;gBAAE,OAAO,gBAAgB,CAAC;YACrD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,CAAC,eAAe,UAAoB,EAAE,EAAE,CAC9D,MAAM,CACJ,KAAC,gBAAgB,cACf,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YACzC,KAAC,WAAW,IAAC,OAAO,EAAE,WAAW,GAAI,GACd,GACR,CACpB,CAAC;IAEJ,MAAM,aAAa,GAAG,GAAG,EAAE,CACzB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAErD,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;QACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB;QACzE,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;QACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAE/C,4BAA4B;QAC5B,uCAAuC;QACvC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QACtC,MAAM,aAAa,EAAE,CAAC;QAEtB,wBAAwB;QACxB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,iCAAiC;QACjC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC1D,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB;QACzE,YAAY,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC;QACxD,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAE/C,kFAAkF;QAClF,iEAAiE;QACjE,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QACtC,MAAM,aAAa,EAAE,CAAC;QACtB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QACtC,MAAM,aAAa,EAAE,CAAC;QAEtB,+BAA+B;QAC/B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAEpC,0BAA0B;QAC1B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAEpC,0CAA0C;QAC1C,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxB,MAAM,aAAa,EAAE,CAAC;QACtB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,6EAA6E;QAC7E,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;QAChE,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAEpC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAChC,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;QAE/C,oBAAoB;QACpB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxB,MAAM,aAAa,EAAE,CAAC;QACtB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAEpD,eAAe;QACf,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,aAAa,EAAE,CAAC;QAEtB,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,sDAAsD;QACtD,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,8BAA8B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACtD,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB;YAChE,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;YAC9F,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrD,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;YACzF,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrD,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iGAAiG,EAAE,GAAG,EAAE;YACzG,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrD,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAC5D,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,8BAA8B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACtD,sBAAsB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrD,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,CAAC;YACxC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAChE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"ModelDialog.test.js","sourceRoot":"","sources":["../../../../src/ui/components/ModelDialog.test.tsx"],"names":[],"mappings":"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"}
@@ -60,15 +60,39 @@ export declare function offsetToLogicalPos(text: string, offset: number): [numbe
60
60
  * Inverse operation of offsetToLogicalPos
61
61
  */
62
62
  export declare function logicalPosToOffset(lines: string[], row: number, col: number): number;
63
+ /**
64
+ * Transformations allow for the CLI to render terse representations of things like file paths
65
+ * (e.g., "@some/path/to/an/image.png" to "[Image image.png]")
66
+ * When the cursor enters a transformed representation, it expands to reveal the logical representation.
67
+ * (e.g., "[Image image.png]" to "@some/path/to/an/image.png")
68
+ */
69
+ export interface Transformation {
70
+ logStart: number;
71
+ logEnd: number;
72
+ logicalText: string;
73
+ collapsedText: string;
74
+ }
75
+ export declare const imagePathRegex: RegExp;
76
+ export declare function getTransformedImagePath(filePath: string): string;
77
+ export declare function calculateTransformationsForLine(line: string): Transformation[];
78
+ export declare function calculateTransformations(lines: string[]): Transformation[][];
79
+ export declare function getTransformUnderCursor(row: number, col: number, spansByLine: Transformation[][]): Transformation | null;
80
+ export declare function calculateTransformedLine(logLine: string, logIndex: number, logicalCursor: [number, number], transformations: Transformation[]): {
81
+ transformedLine: string;
82
+ transformedToLogMap: number[];
83
+ };
63
84
  export interface VisualLayout {
64
85
  visualLines: string[];
65
86
  logicalToVisualMap: Array<Array<[number, number]>>;
66
87
  visualToLogicalMap: Array<[number, number]>;
88
+ transformedToLogicalMaps: number[][];
89
+ visualToTransformedMap: number[];
67
90
  }
68
91
  export interface TextBufferState {
69
92
  lines: string[];
70
93
  cursorRow: number;
71
94
  cursorCol: number;
95
+ transformationsByLine: Transformation[][];
72
96
  preferredCol: number | null;
73
97
  undoStack: UndoHistoryEntry[];
74
98
  redoStack: UndoHistoryEntry[];
@@ -284,6 +308,18 @@ export interface TextBuffer {
284
308
  * begins within the logical buffer. Indices are code-point based.
285
309
  */
286
310
  visualToLogicalMap: Array<[number, number]>;
311
+ /**
312
+ * For each logical line, an array mapping transformed positions (in the transformed
313
+ * line) back to logical column indices.
314
+ */
315
+ transformedToLogicalMaps: number[][];
316
+ /**
317
+ * For each visual line (absolute index across all visual lines), the start index
318
+ * within that logical line's transformed content.
319
+ */
320
+ visualToTransformedMap: number[];
321
+ /** Cached transformations per logical line */
322
+ transformationsByLine: Transformation[][];
287
323
  /**
288
324
  * Replaces the entire buffer content with the provided text.
289
325
  * The operation is undoable.
@@ -7,8 +7,9 @@ import { spawnSync } from 'node:child_process';
7
7
  import fs from 'node:fs';
8
8
  import os from 'node:os';
9
9
  import pathMod from 'node:path';
10
+ import * as path from 'node:path';
10
11
  import { useState, useCallback, useEffect, useMemo, useReducer } from 'react';
11
- import { coreEvents, CoreEvent } from '@google/gemini-cli-core';
12
+ import { coreEvents, CoreEvent, unescapePath } from '@google/gemini-cli-core';
12
13
  import { toCodePoints, cpLen, cpSlice, stripUnsafeCharacters, getCachedStringWidth, } from '../../utils/textUtils.js';
13
14
  import { parsePastedPaths } from '../../utils/clipboardUtils.js';
14
15
  import { handleVimAction } from './vim-buffer-actions.js';
@@ -483,24 +484,136 @@ export function logicalPosToOffset(lines, row, col) {
483
484
  }
484
485
  return offset;
485
486
  }
487
+ export const imagePathRegex = /@((?:\\.|[^\s\r\n\\])+?\.(?:png|jpg|jpeg|gif|webp|svg|bmp))\b/gi;
488
+ export function getTransformedImagePath(filePath) {
489
+ const raw = filePath;
490
+ // Ignore leading @ when stripping directories, but keep it for simple '@file.png'
491
+ const withoutAt = raw.startsWith('@') ? raw.slice(1) : raw;
492
+ // Unescape the path to handle escaped spaces and other characters
493
+ const unescaped = unescapePath(withoutAt);
494
+ // Find last directory separator, supporting both POSIX and Windows styles
495
+ const lastSepIndex = Math.max(unescaped.lastIndexOf('/'), unescaped.lastIndexOf('\\'));
496
+ // If we saw a separator, take the segment after it; otherwise fall back to the unescaped string
497
+ const fileName = lastSepIndex >= 0 ? unescaped.slice(lastSepIndex + 1) : unescaped;
498
+ const extension = path.extname(fileName);
499
+ const baseName = path.basename(fileName, extension);
500
+ const maxBaseLength = 10;
501
+ const truncatedBase = baseName.length > maxBaseLength
502
+ ? `...${baseName.slice(-maxBaseLength)}`
503
+ : baseName;
504
+ return `[Image ${truncatedBase}${extension}]`;
505
+ }
506
+ export function calculateTransformationsForLine(line) {
507
+ const transformations = [];
508
+ let match;
509
+ // Reset regex state to ensure clean matching from start of line
510
+ imagePathRegex.lastIndex = 0;
511
+ while ((match = imagePathRegex.exec(line)) !== null) {
512
+ const logicalText = match[0];
513
+ const logStart = cpLen(line.substring(0, match.index));
514
+ const logEnd = logStart + cpLen(logicalText);
515
+ transformations.push({
516
+ logStart,
517
+ logEnd,
518
+ logicalText,
519
+ collapsedText: getTransformedImagePath(logicalText),
520
+ });
521
+ }
522
+ return transformations;
523
+ }
524
+ export function calculateTransformations(lines) {
525
+ return lines.map((ln) => calculateTransformationsForLine(ln));
526
+ }
527
+ export function getTransformUnderCursor(row, col, spansByLine) {
528
+ const spans = spansByLine[row];
529
+ if (!spans || spans.length === 0)
530
+ return null;
531
+ for (const span of spans) {
532
+ if (col >= span.logStart && col <= span.logEnd) {
533
+ return span;
534
+ }
535
+ if (col < span.logStart)
536
+ break;
537
+ }
538
+ return null;
539
+ }
540
+ export function calculateTransformedLine(logLine, logIndex, logicalCursor, transformations) {
541
+ let transformedLine = '';
542
+ const transformedToLogMap = [];
543
+ let lastLogPos = 0;
544
+ const cursorIsOnThisLine = logIndex === logicalCursor[0];
545
+ const cursorCol = logicalCursor[1];
546
+ for (const transform of transformations) {
547
+ const textBeforeTransformation = cpSlice(logLine, lastLogPos, transform.logStart);
548
+ transformedLine += textBeforeTransformation;
549
+ for (let i = 0; i < cpLen(textBeforeTransformation); i++) {
550
+ transformedToLogMap.push(lastLogPos + i);
551
+ }
552
+ const isExpanded = cursorIsOnThisLine &&
553
+ cursorCol >= transform.logStart &&
554
+ cursorCol <= transform.logEnd;
555
+ const transformedText = isExpanded
556
+ ? transform.logicalText
557
+ : transform.collapsedText;
558
+ transformedLine += transformedText;
559
+ // Map transformed characters back to logical characters
560
+ const transformedLen = cpLen(transformedText);
561
+ if (isExpanded) {
562
+ for (let i = 0; i < transformedLen; i++) {
563
+ transformedToLogMap.push(transform.logStart + i);
564
+ }
565
+ }
566
+ else {
567
+ // Collapsed: distribute transformed positions monotonically across the raw span.
568
+ // This preserves ordering across wrapped slices so logicalToVisualMap has
569
+ // increasing startColInLogical and visual cursor mapping remains consistent.
570
+ const logicalLength = Math.max(0, transform.logEnd - transform.logStart);
571
+ for (let i = 0; i < transformedLen; i++) {
572
+ // Map the i-th transformed code point into [logStart, logEnd)
573
+ const transformationToLogicalOffset = logicalLength === 0
574
+ ? 0
575
+ : Math.floor((i * logicalLength) / transformedLen);
576
+ const transformationToLogicalIndex = transform.logStart +
577
+ Math.min(transformationToLogicalOffset, Math.max(logicalLength - 1, 0));
578
+ transformedToLogMap.push(transformationToLogicalIndex);
579
+ }
580
+ }
581
+ lastLogPos = transform.logEnd;
582
+ }
583
+ // Append text after last transform
584
+ const remainingUntransformedText = cpSlice(logLine, lastLogPos);
585
+ transformedLine += remainingUntransformedText;
586
+ for (let i = 0; i < cpLen(remainingUntransformedText); i++) {
587
+ transformedToLogMap.push(lastLogPos + i);
588
+ }
589
+ // For a cursor at the very end of the transformed line
590
+ transformedToLogMap.push(cpLen(logLine));
591
+ return { transformedLine, transformedToLogMap };
592
+ }
486
593
  // Calculates the visual wrapping of lines and the mapping between logical and visual coordinates.
487
594
  // This is an expensive operation and should be memoized.
488
- function calculateLayout(logicalLines, viewportWidth) {
595
+ function calculateLayout(logicalLines, viewportWidth, logicalCursor) {
489
596
  const visualLines = [];
490
597
  const logicalToVisualMap = [];
491
598
  const visualToLogicalMap = [];
599
+ const transformedToLogicalMaps = [];
600
+ const visualToTransformedMap = [];
492
601
  logicalLines.forEach((logLine, logIndex) => {
493
602
  logicalToVisualMap[logIndex] = [];
494
- if (logLine.length === 0) {
603
+ const transformations = calculateTransformationsForLine(logLine);
604
+ const { transformedLine, transformedToLogMap } = calculateTransformedLine(logLine, logIndex, logicalCursor, transformations);
605
+ transformedToLogicalMaps[logIndex] = transformedToLogMap;
606
+ if (transformedLine.length === 0) {
495
607
  // Handle empty logical line
496
608
  logicalToVisualMap[logIndex].push([visualLines.length, 0]);
497
609
  visualToLogicalMap.push([logIndex, 0]);
610
+ visualToTransformedMap.push(0);
498
611
  visualLines.push('');
499
612
  }
500
613
  else {
501
614
  // Non-empty logical line
502
615
  let currentPosInLogLine = 0; // Tracks position within the current logical line (code point index)
503
- const codePointsInLogLine = toCodePoints(logLine);
616
+ const codePointsInLogLine = toCodePoints(transformedLine);
504
617
  while (currentPosInLogLine < codePointsInLogLine.length) {
505
618
  let currentChunk = '';
506
619
  let currentChunkVisualWidth = 0;
@@ -570,11 +683,13 @@ function calculateLayout(logicalLines, viewportWidth) {
570
683
  currentChunk = codePointsInLogLine[currentPosInLogLine];
571
684
  numCodePointsInChunk = 1;
572
685
  }
686
+ const logicalStartCol = transformedToLogMap[currentPosInLogLine] ?? 0;
573
687
  logicalToVisualMap[logIndex].push([
574
688
  visualLines.length,
575
- currentPosInLogLine,
689
+ logicalStartCol,
576
690
  ]);
577
- visualToLogicalMap.push([logIndex, currentPosInLogLine]);
691
+ visualToLogicalMap.push([logIndex, logicalStartCol]);
692
+ visualToTransformedMap.push(currentPosInLogLine);
578
693
  visualLines.push(currentChunk);
579
694
  const logicalStartOfThisChunk = currentPosInLogLine;
580
695
  currentPosInLogLine += numCodePointsInChunk;
@@ -599,18 +714,21 @@ function calculateLayout(logicalLines, viewportWidth) {
599
714
  logicalToVisualMap[0] = [];
600
715
  logicalToVisualMap[0].push([0, 0]);
601
716
  visualToLogicalMap.push([0, 0]);
717
+ visualToTransformedMap.push(0);
602
718
  }
603
719
  }
604
720
  return {
605
721
  visualLines,
606
722
  logicalToVisualMap,
607
723
  visualToLogicalMap,
724
+ transformedToLogicalMaps,
725
+ visualToTransformedMap,
608
726
  };
609
727
  }
610
728
  // Calculates the visual cursor position based on a pre-calculated layout.
611
729
  // This is a lightweight operation.
612
730
  function calculateVisualCursorFromLayout(layout, logicalCursor) {
613
- const { logicalToVisualMap, visualLines } = layout;
731
+ const { logicalToVisualMap, visualLines, transformedToLogicalMaps } = layout;
614
732
  const [logicalRow, logicalCol] = logicalCursor;
615
733
  const segmentsForLogicalLine = logicalToVisualMap[logicalRow];
616
734
  if (!segmentsForLogicalLine || segmentsForLogicalLine.length === 0) {
@@ -635,9 +753,26 @@ function calculateVisualCursorFromLayout(layout, logicalCursor) {
635
753
  }
636
754
  }
637
755
  const [visualRow, startColInLogical] = segmentsForLogicalLine[targetSegmentIndex];
638
- const visualCol = logicalCol - startColInLogical;
639
- // The visual column should not exceed the length of the visual line.
640
- const clampedVisualCol = Math.min(visualCol, cpLen(visualLines[visualRow] ?? ''));
756
+ // Find the coordinates in transformed space in order to conver to visual
757
+ const transformedToLogicalMap = transformedToLogicalMaps[logicalRow] ?? [];
758
+ let transformedCol = 0;
759
+ for (let i = 0; i < transformedToLogicalMap.length; i++) {
760
+ if (transformedToLogicalMap[i] > logicalCol) {
761
+ transformedCol = Math.max(0, i - 1);
762
+ break;
763
+ }
764
+ if (i === transformedToLogicalMap.length - 1) {
765
+ transformedCol = transformedToLogicalMap.length - 1;
766
+ }
767
+ }
768
+ let startColInTransformed = 0;
769
+ while (startColInTransformed < transformedToLogicalMap.length &&
770
+ transformedToLogicalMap[startColInTransformed] < startColInLogical) {
771
+ startColInTransformed++;
772
+ }
773
+ const clampedTransformedCol = Math.min(transformedCol, Math.max(0, transformedToLogicalMap.length - 1));
774
+ const visualCol = clampedTransformedCol - startColInTransformed;
775
+ const clampedVisualCol = Math.min(Math.max(visualCol, 0), cpLen(visualLines[visualRow] ?? ''));
641
776
  return [visualRow, clampedVisualCol];
642
777
  }
643
778
  const historyLimit = 100;
@@ -832,11 +967,20 @@ function textBufferReducerLogic(state, action, options = {}) {
832
967
  }
833
968
  }
834
969
  if (visualToLogicalMap[newVisualRow]) {
835
- const [logRow, logStartCol] = visualToLogicalMap[newVisualRow];
970
+ const [logRow, logicalStartCol] = visualToLogicalMap[newVisualRow];
971
+ const transformedToLogicalMap = visualLayout.transformedToLogicalMaps?.[logRow] ?? [];
972
+ let transformedStartCol = 0;
973
+ while (transformedStartCol < transformedToLogicalMap.length &&
974
+ transformedToLogicalMap[transformedStartCol] < logicalStartCol) {
975
+ transformedStartCol++;
976
+ }
977
+ const clampedTransformedCol = Math.min(transformedStartCol + newVisualCol, Math.max(0, transformedToLogicalMap.length - 1));
978
+ const newLogicalCol = transformedToLogicalMap[clampedTransformedCol] ??
979
+ cpLen(lines[logRow] ?? '');
836
980
  return {
837
981
  ...state,
838
982
  cursorRow: logRow,
839
- cursorCol: clamp(logStartCol + newVisualCol, 0, cpLen(lines[logRow] ?? '')),
983
+ cursorCol: newLogicalCol,
840
984
  preferredCol: newPreferredCol,
841
985
  };
842
986
  }
@@ -1123,11 +1267,28 @@ function textBufferReducerLogic(state, action, options = {}) {
1123
1267
  }
1124
1268
  export function textBufferReducer(state, action, options = {}) {
1125
1269
  const newState = textBufferReducerLogic(state, action, options);
1270
+ const newTransformedLines = newState.lines !== state.lines
1271
+ ? calculateTransformations(newState.lines)
1272
+ : state.transformationsByLine;
1273
+ const oldTransform = getTransformUnderCursor(state.cursorRow, state.cursorCol, state.transformationsByLine);
1274
+ const newTransform = getTransformUnderCursor(newState.cursorRow, newState.cursorCol, newTransformedLines);
1275
+ const oldInside = oldTransform !== null;
1276
+ const newInside = newTransform !== null;
1277
+ const movedBetweenTransforms = oldTransform !== newTransform &&
1278
+ (oldTransform !== null || newTransform !== null);
1126
1279
  if (newState.lines !== state.lines ||
1127
- newState.viewportWidth !== state.viewportWidth) {
1280
+ newState.viewportWidth !== state.viewportWidth ||
1281
+ oldInside !== newInside ||
1282
+ movedBetweenTransforms) {
1283
+ const shouldResetPreferred = oldInside !== newInside || movedBetweenTransforms;
1128
1284
  return {
1129
1285
  ...newState,
1130
- visualLayout: calculateLayout(newState.lines, newState.viewportWidth),
1286
+ preferredCol: shouldResetPreferred ? null : newState.preferredCol,
1287
+ visualLayout: calculateLayout(newState.lines, newState.viewportWidth, [
1288
+ newState.cursorRow,
1289
+ newState.cursorCol,
1290
+ ]),
1291
+ transformationsByLine: newTransformedLines,
1131
1292
  };
1132
1293
  }
1133
1294
  return newState;
@@ -1137,11 +1298,13 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1137
1298
  const initialState = useMemo(() => {
1138
1299
  const lines = initialText.split('\n');
1139
1300
  const [initialCursorRow, initialCursorCol] = calculateInitialCursorPosition(lines.length === 0 ? [''] : lines, initialCursorOffset);
1140
- const visualLayout = calculateLayout(lines.length === 0 ? [''] : lines, viewport.width);
1301
+ const transformationsByLine = calculateTransformations(lines.length === 0 ? [''] : lines);
1302
+ const visualLayout = calculateLayout(lines.length === 0 ? [''] : lines, viewport.width, [initialCursorRow, initialCursorCol]);
1141
1303
  return {
1142
1304
  lines: lines.length === 0 ? [''] : lines,
1143
1305
  cursorRow: initialCursorRow,
1144
1306
  cursorCol: initialCursorCol,
1307
+ transformationsByLine,
1145
1308
  preferredCol: null,
1146
1309
  undoStack: [],
1147
1310
  redoStack: [],
@@ -1153,10 +1316,10 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1153
1316
  };
1154
1317
  }, [initialText, initialCursorOffset, viewport.width, viewport.height]);
1155
1318
  const [state, dispatch] = useReducer((s, a) => textBufferReducer(s, a, { inputFilter, singleLine }), initialState);
1156
- const { lines, cursorRow, cursorCol, preferredCol, selectionAnchor, visualLayout, } = state;
1319
+ const { lines, cursorRow, cursorCol, preferredCol, selectionAnchor, visualLayout, transformationsByLine, } = state;
1157
1320
  const text = useMemo(() => lines.join('\n'), [lines]);
1158
1321
  const visualCursor = useMemo(() => calculateVisualCursorFromLayout(visualLayout, [cursorRow, cursorCol]), [visualLayout, cursorRow, cursorCol]);
1159
- const { visualLines, visualToLogicalMap } = visualLayout;
1322
+ const { visualLines, visualToLogicalMap, transformedToLogicalMaps, visualToTransformedMap, } = visualLayout;
1160
1323
  const [visualScrollRow, setVisualScrollRow] = useState(0);
1161
1324
  useEffect(() => {
1162
1325
  if (onChange) {
@@ -1494,12 +1657,16 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1494
1657
  dispatch({ type: 'move_to_offset', payload: { offset } });
1495
1658
  }, []);
1496
1659
  const moveToVisualPosition = useCallback((visRow, visCol) => {
1497
- const { visualLines, visualToLogicalMap } = visualLayout;
1660
+ const { visualLines, visualToLogicalMap, transformedToLogicalMaps, visualToTransformedMap, } = visualLayout;
1498
1661
  // Clamp visRow to valid range
1499
1662
  const clampedVisRow = Math.max(0, Math.min(visRow, visualLines.length - 1));
1500
1663
  const visualLine = visualLines[clampedVisRow] || '';
1501
1664
  if (visualToLogicalMap[clampedVisRow]) {
1502
- const [logRow, logStartCol] = visualToLogicalMap[clampedVisRow];
1665
+ const [logRow] = visualToLogicalMap[clampedVisRow];
1666
+ const transformedToLogicalMap = transformedToLogicalMaps?.[logRow] ?? [];
1667
+ // Where does this visual line begin within the transformed line?
1668
+ const startColInTransformed = visualToTransformedMap?.[clampedVisRow] ?? 0;
1669
+ // Handle wide characters: convert visual X position to character offset
1503
1670
  const codePoints = toCodePoints(visualLine);
1504
1671
  let currentVisX = 0;
1505
1672
  let charOffset = 0;
@@ -1518,8 +1685,10 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1518
1685
  }
1519
1686
  // Clamp charOffset to length
1520
1687
  charOffset = Math.min(charOffset, codePoints.length);
1688
+ // Map character offset through transformations to get logical position
1689
+ const transformedCol = Math.min(startColInTransformed + charOffset, Math.max(0, transformedToLogicalMap.length - 1));
1521
1690
  const newCursorRow = logRow;
1522
- const newCursorCol = logStartCol + charOffset;
1691
+ const newCursorCol = transformedToLogicalMap[transformedCol] ?? cpLen(lines[logRow] ?? '');
1523
1692
  dispatch({
1524
1693
  type: 'set_cursor',
1525
1694
  payload: {
@@ -1529,7 +1698,7 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1529
1698
  },
1530
1699
  });
1531
1700
  }
1532
- }, [visualLayout]);
1701
+ }, [visualLayout, lines]);
1533
1702
  const getOffset = useCallback(() => logicalPosToOffset(lines, cursorRow, cursorCol), [lines, cursorRow, cursorCol]);
1534
1703
  const returnValue = useMemo(() => ({
1535
1704
  lines,
@@ -1542,6 +1711,9 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1542
1711
  visualCursor,
1543
1712
  visualScrollRow,
1544
1713
  visualToLogicalMap,
1714
+ transformedToLogicalMaps,
1715
+ visualToTransformedMap,
1716
+ transformationsByLine,
1545
1717
  setText,
1546
1718
  insert,
1547
1719
  newline,
@@ -1605,6 +1777,10 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1605
1777
  renderedVisualLines,
1606
1778
  visualCursor,
1607
1779
  visualScrollRow,
1780
+ visualToLogicalMap,
1781
+ transformedToLogicalMaps,
1782
+ visualToTransformedMap,
1783
+ transformationsByLine,
1608
1784
  setText,
1609
1785
  insert,
1610
1786
  newline,
@@ -1656,7 +1832,6 @@ export function useTextBuffer({ initialText = '', initialCursorOffset = 0, viewp
1656
1832
  vimMoveToLastLine,
1657
1833
  vimMoveToLine,
1658
1834
  vimEscapeInsertMode,
1659
- visualToLogicalMap,
1660
1835
  ]);
1661
1836
  return returnValue;
1662
1837
  }