Skip to content

feat: Enhance response viewer behavior when receives large response content#9740

Open
cwangsmv wants to merge 5 commits intodevelopfrom
feat/enhance-large-data-response-viewer
Open

feat: Enhance response viewer behavior when receives large response content#9740
cwangsmv wants to merge 5 commits intodevelopfrom
feat/enhance-large-data-response-viewer

Conversation

@cwangsmv
Copy link
Contributor

@cwangsmv cwangsmv commented Mar 24, 2026

Background:

When viewing a large API response (eg: MCP app resources contains the entire DOM tree), the response editor would hang or become unresponsive on load due to CodeMirror performance issue.

Changes:

  • Collapse lines whose length exceeds the limit
  • Insert a CM bookmark allow user to expand the line to view the entire content

INS-2250

Copilot AI review requested due to automatic review settings March 24, 2026 03:27
@cwangsmv cwangsmv marked this pull request as draft March 24, 2026 03:27
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves UI responsiveness when rendering very large response bodies by truncating extremely long individual lines in read-only CodeMirror viewers and providing an inline control to expand them on demand.

Changes:

  • Adds a truncateLongLines prop to CodeEditor and enables it for response viewers and MCP event preview.
  • Implements long-line truncation (>10,000 chars) with an inline “Show full value” bookmark widget to restore the full line.
  • Tweaks CodeMirror configuration with maxHighlightLength to reduce highlight work on long lines.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.

File Description
packages/insomnia/src/ui/components/viewers/response-viewer.tsx Enables long-line truncation for JSON/source response viewing.
packages/insomnia/src/ui/components/mcp/event-view.tsx Enables long-line truncation for MCP message previews.
packages/insomnia/src/ui/components/.client/codemirror/code-editor.tsx Adds truncation implementation + new prop; adjusts CodeMirror options.
Comments suppressed due to low confidence (1)

packages/insomnia/src/ui/components/.client/codemirror/code-editor.tsx:773

  • useImperativeHandle is created with an empty dependency array, but the exposed setValue now depends on shouldTruncateLongLines (derived from props). If readOnly/truncateLongLines changes for an existing mounted editor, the imperative setValue will keep using the initial value and behave incorrectly. Include shouldTruncateLongLines (and any other referenced values) in the dependency array, or wrap it via a ref (e.g. useLatest) to avoid stale closures.
      useImperativeHandle(
        ref,
        () => ({
          setValue: value =>
            shouldTruncateLongLines
              ? setEditorValueWithTruncation(codeMirror.current, value)
              : codeMirror.current?.setValue(value || ''),
          getValue: () => codeMirror.current?.getValue() || '',
          selectAll: () =>
            codeMirror.current?.setSelection({ line: 0, ch: 0 }, { line: codeMirror.current.lineCount(), ch: 0 }),
          focus: () => codeMirror.current?.focus(),
          scrollToSelection: (chStart: number, chEnd: number, lineStart: number, lineEnd: number) => {
            codeMirror.current?.setSelection({ line: lineStart, ch: chStart }, { line: lineEnd, ch: chEnd });
            // If sizing permits, position selection just above center
            codeMirror.current?.scrollIntoView({ line: lineStart, ch: chStart }, window.innerHeight / 2 - 100);
          },
          focusEnd: () => {
            if (codeMirror.current && !codeMirror.current.hasFocus()) {
              codeMirror.current.focus();
            }
            codeMirror.current?.getDoc()?.setCursor(codeMirror.current.getDoc().lineCount(), 0);
          },
          getCursor: () => {
            return codeMirror.current?.getCursor();
          },
          setCursorLine: (lineNumber: number) => {
            codeMirror.current?.setCursor(lineNumber);
          },
          tryToSetOption,
          hasFocus: () => codeMirror.current?.hasFocus() as boolean,
          indexFromPos: (pos?: CodeMirror.Position) => (pos ? codeMirror.current?.indexFromPos(pos) || 0 : 0),
          getDoc: () => codeMirror.current?.getDoc(),
        }),
        [],
      );

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@github-actions
Copy link

github-actions bot commented Mar 24, 2026

✅ Circular References Report

Generated at: 2026-03-25T02:53:27.333Z
Status: ✅ NO CHANGE

Summary

Metric Base (develop) PR Change
Total Circular References 73 73 0 (0.00%)
Click to view all circular references in PR (73)
insomnia-inso/src/db/models/types.ts -> insomnia-inso/src/db/types.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/cancellation.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/cancellation.ts -> insomnia/src/script-executor.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/cancellation.ts -> insomnia/src/script-executor.ts -> insomnia/src/require-interceptor.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/concurrency.ts
insomnia/src/common/constants.ts -> insomnia/src/models/mock-server.ts -> insomnia/src/models/workspace.ts -> insomnia/src/models/project.ts -> insomnia/src/common/misc.ts
insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/request-version.ts
insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/socket-io-response.ts
insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/websocket-response.ts
insomnia/src/models/index.ts -> insomnia/src/models/socket-io-response.ts
insomnia/src/models/index.ts -> insomnia/src/models/stats.ts
insomnia/src/models/index.ts -> insomnia/src/models/websocket-response.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/request-group.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/mock-route.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/request-version.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/request-version.ts -> insomnia/src/models/socket-io-request.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/request-version.ts -> insomnia/src/models/websocket-request.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/stats.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/main/network/libcurl-promise.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/main/network/libcurl-promise.ts -> insomnia/src/main/network/multipart.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/common-headers.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/plugins/index.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/sorting.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/basic-auth/get-header.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/bearer-auth/get-header.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/o-auth-1/get-token.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/o-auth-2/get-token.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/concurrency.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts -> insomnia/src/plugins/context/request.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/import.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/import.ts -> insomnia/src/common/insomnia-v5.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/import.ts -> insomnia/src/main/importers/convert.ts -> insomnia/src/main/importers/importers/index.ts -> insomnia/src/main/importers/importers/postman.ts
insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts
insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/websocket-response.ts
insomnia/src/network/authentication.ts -> insomnia/src/network/o-auth-2/get-token.ts
insomnia/src/network/network.ts -> insomnia/src/common/render.ts
insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/o-auth-2/get-token.ts
insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts
insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/plugins/index.ts
insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts
insomnia/src/plugins/index.ts -> insomnia/src/plugins/context/store.ts
insomnia/src/plugins/index.ts -> insomnia/src/plugins/misc.ts
insomnia/src/templating/base-extension-worker.ts -> insomnia/src/templating/worker.ts
insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/plugins/index.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/plugins/index.ts -> insomnia/src/plugins/context/app.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts -> insomnia/src/templating/utils.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/local-template-tags.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/ui/worker/templating-handler.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts -> insomnia/src/plugins/context/request.ts
insomnia/src/ui/components/settings/import-export.tsx -> insomnia/src/ui/components/modals/export-requests-modal.tsx
insomnia/src/ui/components/tabs/tab-list.tsx -> insomnia/src/ui/components/tabs/tab.tsx
insomnia/src/ui/components/templating/tag-editor-arg-sub-form.tsx -> insomnia/src/ui/components/templating/external-vault/external-vault-form.tsx
insomnia/src/ui/components/viewers/response-viewer.tsx -> insomnia/src/ui/components/viewers/response-multipart-viewer.tsx
insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts
Click to view all circular references in base branch (73)
insomnia-inso/src/db/models/types.ts -> insomnia-inso/src/db/types.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/cancellation.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/cancellation.ts -> insomnia/src/script-executor.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/cancellation.ts -> insomnia/src/script-executor.ts -> insomnia/src/require-interceptor.ts
insomnia-scripting-environment/src/objects/index.ts -> insomnia-scripting-environment/src/objects/collection.ts -> insomnia-scripting-environment/src/objects/auth.ts -> insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/concurrency.ts
insomnia/src/common/constants.ts -> insomnia/src/models/mock-server.ts -> insomnia/src/models/workspace.ts -> insomnia/src/models/project.ts -> insomnia/src/common/misc.ts
insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/request-version.ts
insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/socket-io-response.ts
insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/websocket-response.ts
insomnia/src/models/index.ts -> insomnia/src/models/socket-io-response.ts
insomnia/src/models/index.ts -> insomnia/src/models/stats.ts
insomnia/src/models/index.ts -> insomnia/src/models/websocket-response.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/request-group.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/mock-route.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/request-version.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/request-version.ts -> insomnia/src/models/socket-io-request.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/request-version.ts -> insomnia/src/models/websocket-request.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/stats.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/main/network/libcurl-promise.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/main/network/libcurl-promise.ts -> insomnia/src/main/network/multipart.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/common-headers.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/plugins/index.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/sorting.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/basic-auth/get-header.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/bearer-auth/get-header.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/o-auth-1/get-token.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/o-auth-2/get-token.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/concurrency.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts -> insomnia/src/plugins/context/request.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/import.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/import.ts -> insomnia/src/common/insomnia-v5.ts
insomnia/src/models/request.ts -> insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/import.ts -> insomnia/src/main/importers/convert.ts -> insomnia/src/main/importers/importers/index.ts -> insomnia/src/main/importers/importers/postman.ts
insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts
insomnia/src/models/response.ts -> insomnia/src/models/helpers/request-operations.ts -> insomnia/src/models/index.ts -> insomnia/src/models/websocket-response.ts
insomnia/src/network/authentication.ts -> insomnia/src/network/o-auth-2/get-token.ts
insomnia/src/network/network.ts -> insomnia/src/common/render.ts
insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts -> insomnia/src/network/o-auth-2/get-token.ts
insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts
insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/plugins/index.ts
insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts
insomnia/src/plugins/index.ts -> insomnia/src/plugins/context/store.ts
insomnia/src/plugins/index.ts -> insomnia/src/plugins/misc.ts
insomnia/src/templating/base-extension-worker.ts -> insomnia/src/templating/worker.ts
insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/plugins/index.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/plugins/index.ts -> insomnia/src/plugins/context/app.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/base-extension.ts -> insomnia/src/templating/utils.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/templating/index.ts -> insomnia/src/templating/local-template-tags.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/common/render.ts -> insomnia/src/ui/worker/templating-handler.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/network/authentication.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts
insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts -> insomnia/src/plugins/context/request.ts
insomnia/src/ui/components/settings/import-export.tsx -> insomnia/src/ui/components/modals/export-requests-modal.tsx
insomnia/src/ui/components/tabs/tab-list.tsx -> insomnia/src/ui/components/tabs/tab.tsx
insomnia/src/ui/components/templating/tag-editor-arg-sub-form.tsx -> insomnia/src/ui/components/templating/external-vault/external-vault-form.tsx
insomnia/src/ui/components/viewers/response-viewer.tsx -> insomnia/src/ui/components/viewers/response-multipart-viewer.tsx
insomnia/src/utils/graph-ql.ts -> insomnia/src/templating/types.ts -> insomnia/src/plugins/context/network.ts -> insomnia/src/network/network.ts -> insomnia/src/plugins/context/data.ts -> insomnia/src/common/har.ts

Analysis

No Change: This PR does not introduce or remove any circular references.


This report was generated automatically by comparing against the develop branch.

@cwangsmv cwangsmv requested a review from Copilot March 24, 2026 13:22
@cwangsmv cwangsmv marked this pull request as ready for review March 24, 2026 13:22
@cwangsmv cwangsmv requested a review from a team March 24, 2026 13:22
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (1)

packages/insomnia/src/ui/components/.client/codemirror/code-editor.tsx:777

  • useImperativeHandle is created with an empty dependency array, but the setValue implementation now depends on shouldTruncateLongLines. If readOnly/truncateLongLines changes after mount, the exposed setValue will keep using the initial value and may not truncate when it should (or vice versa). Consider either removing the deps array (recompute each render) or including shouldTruncateLongLines (and any other referenced values you expect to vary) in the deps list.
      useImperativeHandle(
        ref,
        () => ({
          setValue: value =>
            shouldTruncateLongLines
              ? setEditorValueWithTruncation(codeMirror.current, value)
              : codeMirror.current?.setValue(value || ''),
          getValue: () => codeMirror.current?.getValue() || '',
          selectAll: () =>
            codeMirror.current?.setSelection({ line: 0, ch: 0 }, { line: codeMirror.current.lineCount(), ch: 0 }),
          focus: () => codeMirror.current?.focus(),
          scrollToSelection: (chStart: number, chEnd: number, lineStart: number, lineEnd: number) => {
            codeMirror.current?.setSelection({ line: lineStart, ch: chStart }, { line: lineEnd, ch: chEnd });
            // If sizing permits, position selection just above center
            codeMirror.current?.scrollIntoView({ line: lineStart, ch: chStart }, window.innerHeight / 2 - 100);
          },
          focusEnd: () => {
            if (codeMirror.current && !codeMirror.current.hasFocus()) {
              codeMirror.current.focus();
            }
            codeMirror.current?.getDoc()?.setCursor(codeMirror.current.getDoc().lineCount(), 0);
          },
          getCursor: () => {
            return codeMirror.current?.getCursor();
          },
          setCursorLine: (lineNumber: number) => {
            codeMirror.current?.setCursor(lineNumber);
          },
          tryToSetOption,
          hasFocus: () => codeMirror.current?.hasFocus() as boolean,
          indexFromPos: (pos?: CodeMirror.Position) => (pos ? codeMirror.current?.indexFromPos(pos) || 0 : 0),
          getDoc: () => codeMirror.current?.getDoc(),
        }),
        [],

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated 6 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

const length = Math.max(activeResponse.bytesContent, activeResponse.bytesRead);
const isOversizedResponse = length > 5 * 1024 * 1024; // 5MB
const isOversizedResponse = length > LARGE_RESPONSE_MB * 1024 * 1024;
// Oversized repsonses are handled in the response-viewer.tsx for now
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spelling typo in comment: "repsonses" → "responses".

Suggested change
// Oversized repsonses are handled in the response-viewer.tsx for now
// Oversized responses are handled in the response-viewer.tsx for now

Copilot uses AI. Check for mistakes.
Comment on lines +134 to +137
// Perform the editor update in a single operation to minimize reflows y
editor.operation(() => {
editor.setValue(lines.join('\n'));
Object.keys(longLinesMap).forEach(lineStr => {
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lines.join('\n') will normalize all line endings to LF in truncate mode, even when no line actually exceeds the threshold. That can change the displayed/copy-pasted content for many responses >10k chars. Consider only doing the split/join path when at least one long line is detected (otherwise setValue(fullText)), or preserve the original newline sequence when rebuilding.

Copilot uses AI. Check for mistakes.
Comment on lines +104 to +109
if (lines[i].length > threshold) {
// save the original long line in a map for later restoration
longLinesMap[i] = lines[i];
// truncate the line, preserving both the start and end
lines[i] = lines[i].slice(0, LONG_LINE_VISIBLE_CHARS) + lines[i].slice(-LONG_LINE_VISIBLE_CHARS);
}
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Truncating the line by concatenating prefix + suffix means the editor text becomes a different value with no in-text delimiter; since CodeMirror bookmarks/widgets are not part of the document text, copying the truncated view can yield a misleading string with the middle silently removed. Consider inserting a literal placeholder (e.g. an ellipsis with a byte/char count) into the line text itself, and placing the widget after that placeholder.

Copilot uses AI. Check for mistakes.
Comment on lines +111 to +129
const makeToggleWidget = (lineNum: number, originalText: string): HTMLSpanElement => {
const el = document.createElement('span');
el.className = 'line-collapse-widget';
el.style.cssText =
'display:inline-block;padding:0 6px;margin:0 2px;background:var(--hl-md);color:var(--color-font);' +
'border-radius:3px;font-size:0.85em;cursor:pointer;vertical-align:baseline;';

el.textContent = '\u2026 Show full value \u2026';
el.title = 'Expanding long values can affect performance';
el.setAttribute('aria-label', 'Show full value');
el.onclick = () => {
// clear the marker and restore the original long line when the widget is clicked
markerMap.get(lineNum)?.clear();
editor.replaceRange(
originalText,
{ line: lineNum, ch: 0 },
{ line: lineNum, ch: editor.getLine(lineNum).length },
);
};
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The “Show full value” widget is a clickable <span> with only onclick. It’s not keyboard-focusable and won’t be operable via Enter/Space, which is an accessibility issue. Consider using a <button type="button"> for the widget, or add role="button", tabIndex={0}, and key handlers (Enter/Space) plus focus styling.

Copilot uses AI. Check for mistakes.
return el;
};

// Perform the editor update in a single operation to minimize reflows y
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in comment: trailing "y" in "minimize reflows y".

Suggested change
// Perform the editor update in a single operation to minimize reflows y
// Perform the editor update in a single operation to minimize reflows

Copilot uses AI. Check for mistakes.
Comment on lines 750 to +756
useImperativeHandle(
ref,
() => ({
setValue: value => codeMirror.current?.setValue(value),
setValue: value =>
shouldTruncateLongLines
? setEditorValueWithTruncation(codeMirror.current, value)
: codeMirror.current?.setValue(value || ''),
Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

useImperativeHandle(..., [],) now captures shouldTruncateLongLines but never updates if readOnly/truncateLongLines props change after mount, so ref.setValue could apply the wrong behavior. Include shouldTruncateLongLines (and any other referenced values) in the dependency array, or compute the decision inside the callback from current props/refs.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants