npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@byteowlz/pi-auto-rename

v1.0.6

Published

Auto-Rename Extension for pi

Readme

Auto-Rename Extension for pi

Automatically generates descriptive session names based on the first user query, making it easier to find and resume sessions later.

Features

  • Automatic naming: Generates a session name as soon as the first prompt is sent
  • Configurable model: Use any model accessible via pi (Anthropic, OpenAI, Google, etc.)
  • Model selection strategy: Choose whether auto mode prefers current model or cheapest model
  • Fallback model: Specify an alternative model if the primary fails
  • Deterministic fallback: Generate names without LLM if all models fail
  • Custom prompts: Customize the prompt used for name generation
  • Static or dynamic prefixes: Use a fixed string or a shell command for the prefix
  • Readable-id suffix: Append a deterministic [adjective-noun-noun] id
  • Prefix-only mode: Skip LLM entirely and use just the prefix (e.g., workspace name)
  • Manual override: Rename sessions manually via /auto-rename <name>
  • Regenerate names: Force regeneration with /auto-rename regen
  • Connectivity test: Test model availability with /auto-rename test

Installation

Copy or symlink the auto-rename directory to your pi extensions folder:

# Global installation
cp -r auto-rename ~/.pi/agent/extensions/

# Or project-local
cp -r auto-rename .pi/extensions/

Then reload pi or restart it.

Configuration

Create auto-rename.json in one of these locations (searched in order):

  1. ./auto-rename.json (current working directory)
  2. ./.pi/auto-rename.json (project-local)
  3. ~/.pi/agent/auto-rename.json (global)

Default Configuration

{
  "$schema": "./auto-rename.schema.json",
  "model": null,
  "fallbackModel": null,
  "fallbackDeterministic": "readable-id",
  "modelSelection": "current",
  "prompt": "Generate a short, descriptive title...",
  "prefix": "",
  "prefixCommand": null,
  "prefixOnly": false,
  "readableIdSuffix": false,
  "readableIdEnv": "PI_SESSION_READABLE_ID",
  "enabled": true,
  "debug": false
}

Configuration Options

| Option | Type | Default | Description | |--------|------|---------|-------------| | model | object/null | null | Primary model to use ({ provider, id }). If null, auto selection is used. | | fallbackModel | object/null | null | Fallback model if primary fails. If null, skip explicit fallback. | | fallbackDeterministic | string | "readable-id" | Fallback if all LLMs fail: "readable-id" (adjective-noun-noun from session ID), "truncate" (first 50 chars), "words" (first 6 words), "none" | | modelSelection | string | "current" | Auto strategy when model/fallbackModel are null: "current" (current model then cheapest) or "cheapest" (cheapest then current). | | prompt | string | (see above) | Prompt template. Use {{query}} as placeholder | | prefix | string | "" | Static prefix before generated names | | prefixCommand | string/null | null | Shell command to generate dynamic prefix (5s timeout) | | prefixOnly | boolean | false | Skip LLM, use only prefix as full name | | readableIdSuffix | boolean | false | Append [readable-id] to generated names | | readableIdEnv | string/null | "PI_SESSION_READABLE_ID" | Environment variable that can provide a readable-id suffix override | | maxQueryLength | integer | 2000 | Max characters of user query sent to LLM prompt. Longer queries have their middle cut out, preserving beginning and end. | | maxNameLength | integer | 80 | Max characters for the generated name (before prefix/suffix). LLM responses exceeding this are truncated. | | enabled | boolean | true | Enable/disable auto-rename | | debug | boolean | false | Show debug notifications | | wordlistPath | string/null | null | Override path to word_lists.toml (relative to session cwd) | | wordlist | object | null | Inline wordlist override ({ adjectives: [], nouns: [] }) |

Example Configurations

Using OpenAI with Google fallback:

{
  "model": { "provider": "openai", "id": "gpt-4o-mini" },
  "fallbackModel": { "provider": "google", "id": "gemini-2.0-flash" }
}

Local Ollama with cloud fallback:

{
  "model": { "provider": "ollama", "id": "llama3.2" },
  "fallbackModel": { "provider": "anthropic", "id": "claude-3-5-haiku-20241022" },
  "fallbackDeterministic": "words"
}

No LLM fallback, deterministic only on failure:

{
  "model": { "provider": "anthropic", "id": "claude-3-5-haiku-20241022" },
  "fallbackModel": null,
  "fallbackDeterministic": "readable-id"
}

Dynamic prefix from git repo name:

{
  "prefixCommand": "basename $(git rev-parse --show-toplevel 2>/dev/null || pwd)"
}

Result: my-project: Fix Authentication Bug

Workspace prefix + readable-id suffix:

{
  "prefixCommand": "basename $(git rev-parse --show-toplevel 2>/dev/null || pwd)",
  "readableIdSuffix": true
}

Result: my-project: Fix Authentication Bug [brisk-sunflower-river]

Readable-id override from frontend:

{
  "readableIdSuffix": true,
  "readableIdEnv": "PI_SESSION_READABLE_ID"
}

Result: my-project: Fix Authentication Bug [frontend-temp-id]

Workspace name only (no LLM):

{
  "prefixCommand": "basename $(git rev-parse --show-toplevel 2>/dev/null || pwd)",
  "prefixOnly": true
}

Custom wordlist path for readable IDs:

{
  "fallbackDeterministic": "readable-id",
  "wordlistPath": "./word_lists.toml"
}

Result: my-project

Git branch as prefix:

{
  "prefixCommand": "git branch --show-current 2>/dev/null || echo 'main'"
}

Result: feature/auth: Add OAuth Support

Custom prompt for code-focused sessions:

{
  "prompt": "Generate a 3-5 word title for a coding session. Focus on the programming language, framework, or task. Based on:\n\n{{query}}\n\nReply with ONLY the title.",
  "prefix": "code: "
}

Commands

| Command | Description | |---------|-------------| | /auto-rename | Show current session name | | /auto-rename <name> | Manually set session name | | /auto-rename regen | Force regenerate name from first query | | /auto-rename config | Show current configuration | | /auto-rename init | Create default config in current directory | | /auto-rename test | Test model connectivity |

How It Works

  1. On session_start, the extension checks if the session already has a name
  2. After the first before_agent_start event (first prompt send), it:
    • Resolves the prefix (runs prefixCommand if set, otherwise uses static prefix)
    • If prefixOnly is true: uses just the prefix as the session name
    • Otherwise: extracts the first user message and tries to generate a name:
      1. Try primary model
      2. If primary fails, try fallback model
      3. If both fail, use deterministic fallback (readable-id, truncate, words, or none)
    • Combines prefix + generated name and sets via pi.setSessionName()
  3. The name appears in the session selector (/resume) instead of the first message

Input and Output Guards

The extension protects against excessively long inputs and outputs:

  • Query truncation (maxQueryLength, default 2000): When the user's first message is very long (e.g., pasting a large code block or document), the middle section is cut out and replaced with a [...truncated...] marker. The beginning (60%) and end (40%) of the query are preserved at word boundaries, keeping both the initial context and the trailing question/details. This prevents excessive token usage and keeps costs low.

  • Name length enforcement (maxNameLength, default 80): If the LLM returns a name longer than maxNameLength characters, it is truncated at a word boundary with an ellipsis. This ensures session names stay readable in the session selector UI.

Both limits can be tuned in the config. Enable debug: true to see notifications when truncation occurs.

Error Handling

The extension provides detailed error messages for common issues:

  • Provider not found: Shows available providers
  • Model not found: Indicates the model ID is invalid
  • No API key: Reminds you to set the environment variable
  • Authentication failed (401/403): API key is invalid or expired
  • Rate limited (429): Too many requests, uses fallback
  • Timeout: Network issues, uses fallback

Enable debug: true to see all error details.

Fallback Chain

Configured model → Configured fallback → Auto strategy → Deterministic function → (no name)
      ↓                  ↓                 ↓                    ↓
   Success?           Success?     current/cheapest         "truncate" / "words"
      ↓                  ↓                 ↓                    ↓
    Done!              Done!             Done!             Done! (or skip if "none")

Auto strategy is controlled by modelSelection:

  • "current": current model, then cheapest
  • "cheapest": cheapest, then current

Session File Format

The extension writes to the standard pi session format using pi.setSessionName(), which appends a session_info entry to the JSONL session file:

{"type":"session_info","id":"...","parentId":"...","timestamp":"...","name":"Your Generated Name"}

This is the canonical field for session names in pi-agent session files.

Requirements

  • pi-coding-agent (pi)
  • An API key for at least one configured model provider (or use prefixOnly)
  • Node.js 18+

Tips

  • Use a fast, cheap model (like claude-3-5-haiku or gpt-4o-mini) for quick naming
  • Set up a fallback model from a different provider for reliability
  • Use fallbackDeterministic: "readable-id" for canonical session IDs
  • Keep the prefix short to avoid truncation in the session selector
  • Enable debug: true temporarily to troubleshoot issues
  • Use /auto-rename test to verify model connectivity before relying on it
  • The extension skips renaming if the session already has a name

Files

  • index.ts - Extension source code
  • auto-rename.schema.json - JSON Schema (Draft-07) for configuration validation
  • auto-rename.example.json - Example configuration file
  • README.md - This documentation

License

MIT