# Kibana DevTools stuck on autocomplete when typing a simple GET

**URL:** <https://discuss.elastic.co/t/kibana-devtools-stuck-on-autocomplete-when-typing-a-simple-get/382631>\
**Category:** Kibana\
**Created:** [October 13, 2025, 11:31am UTC](https://discuss.elastic.co/t/kibana-devtools-stuck-on-autocomplete-when-typing-a-simple-get/382631 "2025-10-13T11:31:55Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![PeterDK](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/peterdk/32/49432_2.png) [@PeterDK](https://discuss.elastic.co/u/PeterDK)\
**Post date:** [October 13, 2025, 11:31am UTC](https://discuss.elastic.co/t/kibana-devtools-stuck-on-autocomplete-when-typing-a-simple-get/382631/1 "2025-10-13T11:31:55Z")

</div>

Kibana version: 8.19.4

Tested on different browsers both in normal and private mode

When you have already a lot of queries in dev tools (let’s say 10000 lines) and want to add another by simply typing GET the browser is stuck for more than 1 minute. After that it downloads 3.1MB for some autocomplete. According to the browser network tools: api/console/autocomplete\_entities?fields=true&indices=true&templates=true&dataStreams=true

If you type a new GET at the top, you don’t have that issue.

But when you leave the dev tools open, it also refreshes frequently and every cycle (around 1 minute) it downloads again 3.1MB. So, after an hour you downloaded around 200MB for just leaving the tab open in your browser.

What changed in Kibana DevTools to cause this behavior and is this really necessary? DevTools was working just fine in version 8.18.x

---

<div class="post-metadata">

**Author:** ![stephenb](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/stephenb/32/40856_2.png) [@stephenb](https://discuss.elastic.co/u/stephenb)\
**Post date:** [October 13, 2025, 1:51pm UTC](https://discuss.elastic.co/t/kibana-devtools-stuck-on-autocomplete-when-typing-a-simple-get/382631/2 "2025-10-13T13:51:32Z")

</div>

Hi @PeterDK

I reached out internally to see if there's a known issue. We'll see what comes back.

Looks like perhaps there is any Open PR for a similar issue.

> <https://github.com/elastic/kibana/pull/238531>
>
> Fixes https://github.com/elastic/kibana/issues/237845
> 
> \## Summary
> 
> This PR f…ixes the "maximum tokenizer stack size reached" console error which happens when the user adds a lot of lines in the editor. 
> 
> \<details\>
> \<summary\>Sample input that was causing the error:\</summary\>
> 
> \`\`\`
> PUT myindex123
> 
> DELETE myindex123
> 
> PUT .kibana\_test
> 
> PUT .alert\_test
> 
> PUT .alerts\_test
> 
> PUT myindex1234
> 
> PUT mytest
> 
> POST \_aliases
> {
> "actions": \[
> {
> "add": {
> "index": "myindex1234",
> "alias": "myindex123"
> }
> }
> \]
> }
> 
> 
> \# Versioned routes: Version 1 is deprecated
> GET kbn:/api/routing\_example/d/versioned?apiVersion=1
> GET kbn:/api/routing\_example/d/versioned?apiVersion=2
> 
> \# Non-versioned routes
> GET kbn:/api/routing\_example/d/removed\_route
> POST kbn:/api/routing\_example/d/migrated\_route
> {}
> 
> GET .kibana\_usage\_counters/\_search
> {
> "query": {
> "bool": {
> "should": \[
> {"match": { "usage-counter.counterType": "deprecated\_api\_call:total"}},
> {"match": { "usage-counter.counterType": "deprecated\_api\_call:resolved"}},
> {"match": { "usage-counter.counterType": "deprecated\_api\_call:marked\_as\_resolved"}}
> \]
> }
> }
> }
> 
> PUT myindexflat
> {
> "mappings": {
> "properties": {
> "flat": {
> "type": "flattened"
> }
> }
> }
> }
> 
> PUT myindexflat/\_doc/123
> {
> "flat": \[{"test": 1},{"test": 2},{"another": 1}\]
> }
> 
> POST myindexflat/\_search
> {
> "fields": \["flat.test"\],
> "\_source": false
> }
> 
> POST kbn:/api/endpoint/suggestions/eventFilters
> {
> "query": "test",
> "field": "test"
> 
> }
> 
> GET .lists-default/\_search?filter\_path=hits
> 
> 
> // Should contain results from hidden index
> GET my\_\*/\_search?filter\_path=hits&expand\_wildcards=all,hidden
> 
> // Should be empty
> GET my\_\*/\_search?filter\_path=hits
> 
> 
> GET .my\*/\_search?filter\_path=hits
> GET .my\_hidden\_index/\_search?filter\_path=hits
> GET my\_hidden\_index/\_search?filter\_path=hits
> 
> PUT .my\_hidden\_index/\_doc/1
> {
> "SHOULD\_NOT\_BE\_HERE": true
> }
> 
> GET .my\_sys\_index
> GET .my\_hidden\_index
> GET \_alias/.my\_hidden\_index
> 
> PUT /
> 
> \# Creates a component template for mappings
> PUT \_component\_template/my-mappings
> {
> "template": {
> "mappings": {
> "properties": {
> "@timestamp": {
> "type": "date",
> "format": "date\_optional\_time||epoch\_millis"
> },
> "message": {
> "type": "wildcard"
> }
> }
> }
> },
> "\_meta": {
> "description": "Mappings for @timestamp and message fields",
> "my-custom-meta-field": "More arbitrary metadata"
> }
> }
> 
> \# Creates a component template for index settings
> PUT \_component\_template/my-settings
> {
> "template": {
> "settings": {
> "index.lifecycle.name": "my-lifecycle-policy"
> }
> },
> "\_meta": {
> "description": "Settings for ILM",
> "my-custom-meta-field": "More arbitrary metadata"
> }
> }
> 
> 
> PUT \_index\_template/enterprise\_search
> {
> "index\_patterns": \["logs-enterprise\_search\*", "logs-app\_search.\*", "logs-workplace\_search.\*"\],
> "data\_stream": { },
> "composed\_of": \["my-mappings", "my-settings" \],
> "priority": 500,
> "\_meta": {
> "description": "Template for my time series data",
> "my-custom-meta-field": "More arbitrary metadata"
> }
> }
> 
> PUT \_data\_stream/logs-enterprise\_search.whathaveyou
> PUT \_data\_stream/logs-app\_search.whathaveyou
> PUT \_data\_stream/logs-workplace\_search.whathaveyou
> 
> GET \_migration/deprecations
> 
> POST my-data-stream/\_doc
> {
> "@timestamp": "2099-05-06T16:21:15.000Z",
> "message": """192.0.2.42 - - \[06/May/2099:16:21:15 +0000\] "GET /images/bg.jpg HTTP/1.0" 200 24736""",
> "object": {
> "this": "might work",
> "array": \[{ "test": 1 }, { "test": 2 } \]
> }
> }
> 
> GET my-data-stream/\_search
> {
> "runtime\_mappings": {
> "object.array.test2": {
> "type": "long",
> "script": {
> "source": """
> if (params.\_source.object != null && params.\_source.object.array != null) {
> def arr = params.\_source.object.array;
> for (def entry : arr) {
> emit(entry.test + 10)
> }
> return;
> }
> """
> }
> },
> "messageV2": {
> "type": "text",
> "script": {
> "source": """
> if (params.\_source\["messageV2"\] != null) {
> // return what we have in source if there is something
> emit(params.\_source\["messageV2"\]);
> } else {
> // return the original processed in some way
> emit(doc\['message'\].value + " the original, but processed");
> }
> """
> }
> }
> },
> "query": {
> "match\_all": {}
> },
> "fields": \["messageV2", "object.array.test2"\]
> }
> 
> GET \_index\_template/my-index-template
> 
> GET \_data\_stream/my-data-strea
> 
> PUT \_data\_stream/my-data-stream-2
> GET \_data\_stream/my-data-stream
> GET \_data\_stream/my-data-stream-2
> 
> GET \_data\_stream/
> 
> GET .ds-my-data-stream-2025.08.13-000001/\_mapping
> PUT .ds-my-data-stream-2025.08.13-000001/\_mapping
> {
> "\_data\_stream\_timestamp": {
> "enabled": true
> },
> "properties": {
> "@timestamp": {
> "type": "date",
> "format": "date\_optional\_time||epoch\_millis"
> },
> "message": {
> "type": "wildcard"
> },
> "messageV2": {
> "type": "text",
> "fields": {
> "keyword": {
> "type": "keyword",
> "ignore\_above": 256
> }
> }
> },
> "object": {
> "properties": {
> "array": {
> "properties": {
> "test": {
> "type": "long"
> }
> }
> },
> "this": {
> "type": "text",
> "fields": {
> "keyword": {
> "type": "keyword",
> "ignore\_above": 256
> }
> }
> }
> }
> },
> "test": {
> "type": "text",
> "fields": {
> "keyword": {
> "type": "keyword",
> "ignore\_above": 256
> }
> }
> }
> }
> }
> 
> PUT \_index\_template/my-index-template
> {
> "index\_patterns": \[
> "my-data-stream\*"
> \],
> "composed\_of": \[
> "my-mappings",
> "my-settings"
> \],
> "priority": 500,
> "\_meta": {
> "my-custom-meta-field": "More arbitrary metadata",
> "description": "Template for my time series data"
> },
> "data\_stream": {
> "hidden": false,
> "allow\_custom\_routing": false
> }
> }
> \`\`\`
> \</details\>
> 
> \*\*Root Cause:\*\*
> The xjson lexer rules inherited from \`buildXjsonRules()\` used Monaco's \`@push\` and \`@pop\` state management for
> opening/closing braces (\`{\` and \`}\`). When Console displayed multiple requests sequentially (e.g., \`GET 
> /index\`, \`POST /data {...}\`, \`PUT /data {...}\`), the tokenizer would push a new state for each opening brace
> but never properly pop back to the root state between requests. This caused stack accumulation,
> eventually exceeding Monaco's tokenizer stack limit.
> 
> \*\*The Fix:\*\*
> The fix overrides the brace handling rules in \`json\_root\` to avoid using \`@push/@pop\`:
> 
> 1. When a \`}\` appears at the end of a line, it explicitly
> transitions back to the 'root' state, ensuring clean state boundaries between requests.
> 2. The \`{\` token is treated as a simple token without pushing state onto
> the stack.
> 3. The original xjson brace rules (which used @push/@pop) are filtered out
> before including the remaining \`xjson\` rules.

---

<div class="post-metadata">

**Author:** ![stephenb](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/stephenb/32/40856_2.png) [@stephenb](https://discuss.elastic.co/u/stephenb)\
**Post date:** [October 15, 2025, 2:00pm UTC](https://discuss.elastic.co/t/kibana-devtools-stuck-on-autocomplete-when-typing-a-simple-get/382631/3 "2025-10-15T14:00:51Z")

</div>

@PeterDK

Looks like that wasn't really exactly the same bug but a new one has been opened

You might want to follow it

> <https://github.com/elastic/kibana/issues/239064>
>
> \*\*Kibana version:\*\* 9.1.3
> 
> \*\*Elasticsearch version:\*\* 9.1.3
> 
> \*\*Server OS version…:\*\*ECH
> 
> \*\*Browser version:\*\*Version 141.0.7390.78 (Official Build) (arm64)
> 
> \*\*Browser OS version:\*\*MAC 15.7.1 (24G231)
> 
> \*\*Original install method (e.g. download page, yum, from source, etc.):\*\*Not sure
> 
> \*\*Describe the bug:\*\* In dev tools (shell) when I have a lot of items the tab browser hangs if I add a new command
> It hangs right after adding the command type, GET in my case
> 
> \*\*Steps to reproduce:\*\*
> 1. Add thousands of commands to dev tools shell
> 2. Go to the bottom of the shell command list and create a new line
> 3. Start typing a new command like "GET \_cat/indices"
> 4. The tab hands after I add space right after the GET command
> 5. In some cases the tab hangs even before the full command name is typed, just the letter g out of GET for example
> 
> \*\*Expected behavior:\*\*
> Allow working with any number of commands in dev tools
> \*\*Screenshots (if relevant):\*\*
> 
> \*\*Errors in browser console (if relevant):\*\*
> 
> \<img width="960" height="463" alt="Image" src="https://github.com/user-attachments/assets/d2cb366d-e848-446b-b5d2-a176aa072452" /\>
> 
> \<img width="1920" height="1012" alt="Image" src="https://github.com/user-attachments/assets/27e1c75c-b96b-4b2f-b56c-4ea18c25647c" /\>
> 
> \<img width="1910" height="1012" alt="Image" src="https://github.com/user-attachments/assets/39a7591a-f3ea-44b5-825d-3238e99e8b4f" /\>
> 
> \<img width="1916" height="935" alt="Image" src="https://github.com/user-attachments/assets/e6c8ff0f-4c96-4bf8-987f-59b7d431f0d6" /\>
> 
> 
> \*\*Provide logs and/or server output (if relevant):\*\*
> 
> \*\*Any additional context:\*\*
> This worked well until a few versions back, I think it started around 8.19 or 8.18
> The screen shots show the issue at 6K rows as well as 2.7K rows 
> And after reducing the number of commands t0 589 the issue is gone
