Review of "LLM Popup" version 1

Details Page Preview

Top-bar popup for querying LLMs: local Ollama/llama.cpp, OpenAI-compatible APIs, Anthropic (Claude) and Google Gemini. Features: * Multiple provider profiles, each with its own URL and model * Streaming responses * Local conversation history * API keys stored in the GNOME keyring (libsecret), never in plain text * Configurable keyboard shortcut, including special keys such as the Copilot key Network access: the extension only connects to the provider endpoints you configure. Clipboard access: the "copy response" action copies the last response to the clipboard, and only when you trigger it.

Extension Homepage
https://github.com/hselley/llm-popup

No comments.

FAQ

Files

Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.

Shexli (experimental) warning 5 manual_review 1

Shexli found 6 issues that may need reviewer attention.

EGO-X-004 warning

extensions should avoid synchronous file IO in shell code

Shell code should avoid synchronous file IO APIs like `GLib.file_get_contents()` and `Gio.File.load_contents()`.

File Operations

  • extension.js:505
    file.load_contents(null)
  • extension.js:589
    Gio.File.new_for_path(path).load_contents(null)

EGO-A-005 manual_review

extensions should not access the clipboard directly

Direct clipboard access via `St.Clipboard.get_default()` requires reviewer scrutiny.

Review Guidelines

  • extension.js:642
    St.Clipboard.get_default()

EGO-P-006 warning

unnecessary build and translation artifacts should not be shipped

Compiled GSettings schemas should not be shipped for 45+ packages.

Don't include unnecessary files

  • schemas/gschemas.compiled
    schemas/gschemas.compiled

EGO-L-001 warning

extension must not create GObject instances or modify shell before enable()

Resource creation or signal/source setup was found outside `enable()`.

Only use initialization for static resources

  • secrets.js:8
    new Secret.Schema(
        'org.gnome.shell.extensions.llm-popup',
        Secret.SchemaFlags.NONE,
        {profile: Secret.SchemaAttributeType.STRING})

EGO-L-003 warning

signals connected by extension should be disconnected in disable()

Signals assigned in `enable()` are missing matching disconnect calls in `disable()` or its helper methods.

Disconnect all signals

  • extension.js:66
            this.menu.connect('open-state-changed', (_menu, open) => {
                if (open) {
                    this._refreshProviders();
                    this._refreshModels().catch(logError);
                    this._focusEntry();
                    this._refreshHistory().catch(logError);
                }
          

EGO-L-004 warning

main loop sources should be removed in disable()

Main loop sources assigned in `enable()` are missing matching removals in `disable()` or its helper methods.

Remove main loop sources

  • extension.js:661
            this._focusIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
                this._focusIdleId = 0;
                global.stage.set_key_focus(this._entry.clutter_text);
                return GLib.SOURCE_REMOVE;
            })
  • extension.js:650
            this._scrollIdleId = GLib.idle_add(GLib.PRIORITY_LOW, () => {
                this._scrollIdleId = 0;
                const adj = this._scroll.vadjustment;
                adj.value = adj.upper - adj.page_size;
                return GLib.SOURCE_REMOVE;
            })

All Versions

Version Status
1 Unreviewed