{
  "name": "sessions",
  "kind": "registry",
  "title": "Sessions",
  "description": "Every Claude Code, Codex and Copilot CLI session on this machine and what each is doing: working, your turn, waiting on you, or ended. Enter brings the session's terminal to the front.",
  "version": "0.1.0",
  "icon": {
    "tile": {
      "glyph": "󰚩",
      "bg": "violet"
    }
  },
  "author": "pal",
  "spec": "github:zcag/pal/extensions/sessions@v0.9.1",
  "source": "https://github.com/zcag/pal/tree/HEAD/extensions/sessions",
  "commit": "63287e180ce349dac3aa87c68ce4c80bc42ad409",
  "manifest": {
    "name": "sessions",
    "title": "Sessions",
    "description": "Every Claude Code, Codex and Copilot CLI session on this machine and what each is doing: working, your turn, waiting on you, or ended. Enter brings the session's terminal to the front.",
    "version": "0.1.0",
    "icon": {
      "tile": {
        "glyph": "󰚩",
        "bg": "violet"
      }
    },
    "author": "pal",
    "repo": "bundled",
    "keywords": [
      "ai",
      "agent",
      "claude",
      "codex",
      "copilot"
    ],
    "settings": [
      {
        "kind": "list",
        "id": "agents",
        "label": "Agents",
        "description": "Which agents' files are read: claude, codex, copilot.",
        "placeholder": "claude",
        "default": [
          "claude",
          "codex",
          "copilot"
        ]
      },
      {
        "kind": "number",
        "id": "stale_minutes",
        "label": "Ended sessions shown for",
        "description": "A session with no process behind it stays listed as ended this long after its last write, so a crash is seen; older ones are only under the Recent filter.",
        "min": 1,
        "max": 1440,
        "unit": "min",
        "default": 30
      },
      {
        "kind": "number",
        "id": "recent_hours",
        "label": "Recent filter",
        "description": "How far back the Recent filter lists sessions to resume.",
        "min": 1,
        "max": 720,
        "unit": "h",
        "default": 24
      },
      {
        "kind": "select",
        "id": "terminal",
        "label": "Terminal",
        "description": "Where Focus looks for the session's window and what Resume opens. Auto tries a tmux pane, then kitty, iTerm2, Terminal, WezTerm, then raises the app the process runs under by its pid; a named one tries tmux then that alone; tmux only stops after the pane.",
        "options": [
          {
            "id": "auto",
            "title": "Auto"
          },
          {
            "id": "kitty",
            "title": "kitty"
          },
          {
            "id": "iterm",
            "title": "iTerm2"
          },
          {
            "id": "terminal",
            "title": "Terminal"
          },
          {
            "id": "wezterm",
            "title": "WezTerm"
          },
          {
            "id": "tmux",
            "title": "tmux only"
          }
        ],
        "default": "auto"
      },
      {
        "kind": "text",
        "id": "editor",
        "label": "Editor",
        "description": "The command Open in editor and Open transcript run (found on PATH, then in Homebrew's and ~/.local/bin); the OS opener when it is not found.",
        "placeholder": "code",
        "default": "code"
      }
    ],
    "links": {
      "state": {
        "description": "Record a session's state from a hook, for ten minutes, over what the files say",
        "params": {
          "agent": {
            "description": "claude, codex or copilot",
            "required": true
          },
          "session": {
            "description": "The session id the CLI gave the hook",
            "required": true
          },
          "state": {
            "description": "working, waiting (your turn) or blocked (a prompt is up)",
            "required": true
          }
        }
      }
    },
    "palettes": {
      "sessions": {
        "title": "Sessions",
        "description": "Every session by state: waiting on you, your turn, working, ended. The pane shows the last exchange and, for a blocked one, the tool call left hanging.",
        "kind": "live",
        "tier": "primary",
        "keys": [
          {
            "keys": "enter",
            "title": "Focus the session's terminal (an ended one: resume it in a new terminal)"
          },
          {
            "keys": "cmd+enter",
            "title": "Send the line typed in the bar to a session in a tmux pane"
          },
          {
            "keys": "cmd+t",
            "title": "The transcript as a view: the last entries as a chat, [ for older, c copies the reply, s sends a line over tmux"
          },
          {
            "keys": "cmd+o",
            "title": "Open the transcript in the editor"
          },
          {
            "keys": "cmd+shift+o",
            "title": "Reveal the transcript"
          },
          {
            "keys": "cmd+e",
            "title": "Open the folder in the editor"
          },
          {
            "keys": "cmd+c",
            "title": "Copy the resume command"
          },
          {
            "keys": "cmd+shift+c",
            "title": "Copy the session id"
          },
          {
            "keys": "cmd+d",
            "title": "Kill the process (asks first; works on marked rows)"
          }
        ]
      }
    },
    "states": {
      "working": {
        "description": "Sessions with a turn in progress",
        "kind": "number"
      },
      "waiting": {
        "description": "Sessions waiting on you (your turn, or blocked on a permission)",
        "kind": "number"
      }
    },
    "bar": {
      "sessions": {
        "title": "Sessions",
        "description": "How many sessions are running, with red !N waiting on you, amber ·N your turn, blue …N working; an alarm while one is waiting on you; hidden with none. The popover lists them by state: Enter focuses the terminal, o opens the transcript, r copies the resume command, x kills.",
        "mocks": {
          "working": {
            "title": "Two sessions working",
            "item": {
              "icon": "󰙴",
              "segments": [
                {
                  "id": "working",
                  "text": "2",
                  "color": "blue"
                }
              ],
              "tooltip": "2 sessions: 2 working"
            }
          },
          "attention": {
            "title": "One waiting on you, one your turn",
            "item": {
              "icon": "󰙴",
              "segments": [
                {
                  "id": "blocked",
                  "text": "1",
                  "color": "red"
                },
                {
                  "id": "waiting",
                  "text": "1",
                  "color": "amber"
                }
              ],
              "urgent": true,
              "tooltip": "2 sessions: 1 waiting on you, 1 your turn"
            }
          },
          "mixed": {
            "title": "Every state at once",
            "item": {
              "icon": "󰙴",
              "segments": [
                {
                  "id": "blocked",
                  "text": "1",
                  "color": "red"
                },
                {
                  "id": "waiting",
                  "text": "1",
                  "color": "amber"
                },
                {
                  "id": "working",
                  "text": "2",
                  "color": "blue"
                }
              ],
              "urgent": true,
              "tooltip": "5 sessions: 1 waiting on you, 1 your turn, 2 working, 1 ended"
            }
          },
          "ended": {
            "title": "One just ended, nothing running",
            "item": {
              "icon": "󰙴",
              "segments": [],
              "tooltip": "1 session: 1 ended"
            }
          },
          "hidden": {
            "title": "No sessions",
            "item": {
              "hidden": true,
              "empty": {
                "icon": "󰙴",
                "tooltip": "No sessions"
              }
            }
          }
        },
        "refresh": {
          "every": 10,
          "on": [
            "show",
            "wake"
          ]
        },
        "keys": [
          {
            "keys": "enter",
            "title": "Focus the session's terminal (an ended one: resume it)"
          },
          {
            "keys": "t",
            "title": "The transcript as a view over the list"
          },
          {
            "keys": "o",
            "title": "Open the transcript in the editor"
          },
          {
            "keys": "r",
            "title": "Copy the resume command"
          },
          {
            "keys": "x",
            "title": "Kill the process (asks first)"
          },
          {
            "keys": "s",
            "title": "Open the palette on a tmux session's row, to type a line into it"
          },
          {
            "keys": "p",
            "title": "Open the Sessions palette"
          },
          {
            "keys": "up",
            "title": "Move between sessions (or j and k)"
          }
        ]
      }
    },
    "license": "MIT",
    "store": {
      "tagline": "Every Claude Code, Codex and Copilot session, and which one needs you",
      "category": "developer",
      "features": [
        "One row per session, sorted by who needs you: waiting on you, your turn, working, ended",
        "Spots a session stuck on a permission prompt; a hook can report the exact state",
        "The last prompt, the last reply, the pending command, the model, folder, branch and token count",
        "`enter` jumps to the session's terminal (tmux, kitty, iTerm2, Terminal, WezTerm); an ended one resumes",
        "`cmd+t` reads the transcript live in the panel; send a line to a tmux session with `cmd+enter`",
        "A bar item counts sessions by state and raises an alarm while one waits on you"
      ],
      "permissions": [
        "ps",
        "lsof",
        "tmux",
        "kitten",
        "wezterm",
        "osascript"
      ],
      "platforms": [
        "macos",
        "linux"
      ],
      "screenshots": [
        {
          "file": "1-list.png",
          "caption": "Every Claude Code, Codex and Copilot session on the machine by state: the one waiting on you first, then your turn, working, ended"
        },
        {
          "file": "2-detail.png",
          "caption": "The pane: your last prompt, the agent's last words and the command it is waiting to run; the folder, tokens and process below"
        },
        {
          "file": "3-transcript.png",
          "caption": "cmd+t reads the transcript inside pal: prompts, replies and every tool call with its outcome, live while it runs"
        },
        {
          "file": "4-actions.png",
          "caption": "⌘K on a session: focus its terminal, send a line to its tmux pane, read or reveal the transcript, copy the resume command"
        },
        {
          "file": "bar-menubar.png",
          "caption": "On the menu bar: how many sessions wait on you, are your turn and are working; the glyph turns red while one waits on you",
          "kind": "bar"
        },
        {
          "file": "bar-popover.png",
          "caption": "A click opens the popover: a row per session by state; Enter focuses its terminal, r copies the resume command",
          "kind": "bar",
          "box": [
            420,
            64,
            840,
            926
          ]
        },
        {
          "file": "bar-popover-transcript.png",
          "caption": "t shows the transcript over the list, the command waiting on you lit",
          "kind": "bar",
          "box": [
            420,
            64,
            840,
            940
          ]
        },
        {
          "file": "bar-sketchybar.png",
          "caption": "On sketchybar: the three counts in red, amber and blue",
          "kind": "bar"
        }
      ],
      "actions": [
        {
          "title": "Focus the terminal",
          "description": "The window the session runs in, in front; a tmux pane is selected on the way.",
          "keys": "enter"
        },
        {
          "title": "Resume in a terminal",
          "description": "On an ended session: a terminal opens in its folder running the resume command.",
          "keys": "enter"
        },
        {
          "title": "Send the line",
          "description": "On a session in a tmux pane: the bar's text typed into it and sent.",
          "keys": "cmd+enter"
        },
        {
          "title": "Transcript",
          "description": "The conversation as a view inside pal, live while the session runs.",
          "keys": "cmd+t"
        },
        {
          "title": "Open transcript in the editor",
          "description": "The transcript file in the editor named in Settings, else the OS's text editor.",
          "keys": "cmd+o"
        },
        {
          "title": "Open in editor",
          "description": "The session's folder in the editor named in Settings, Finder when it is not on PATH.",
          "keys": "cmd+e"
        },
        {
          "title": "Copy resume command",
          "description": "The CLI's own resume line for this session.",
          "keys": "cmd+c"
        },
        {
          "title": "Kill",
          "description": "SIGTERM to the session's process, after a confirm; the transcript stays.",
          "keys": "cmd+d"
        }
      ]
    }
  },
  "playable": false,
  "updated_at": "2026-09-30T01:45:08Z",
  "url": "https://pal.cagdas.io/extensions/sessions",
  "tagline": "Every Claude Code, Codex and Copilot session, and which one needs you",
  "category": "developer",
  "screenshots": [
    "https://pal.cagdas.io/extensions/sessions/screenshots/1-list-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/1-list.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/2-detail-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/2-detail.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/3-transcript-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/3-transcript.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/4-actions-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/4-actions.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-popover-transcript-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-popover-transcript.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-sketchybar-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots": [
    "https://pal.cagdas.io/extensions/sessions/screenshots/1-list.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/2-detail.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/3-transcript.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/4-actions.png"
  ],
  "bar_screenshots": [
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-menubar.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-popover-transcript.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-popover.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-sketchybar.png"
  ],
  "panel_screenshots_dark": [
    "https://pal.cagdas.io/extensions/sessions/screenshots/1-list-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/2-detail-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/3-transcript-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/4-actions-dark.png"
  ],
  "bar_screenshots_dark": [
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-menubar-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-popover-transcript-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-popover-dark.png",
    "https://pal.cagdas.io/extensions/sessions/screenshots/bar-sketchybar-dark.png"
  ],
  "has_bar": true,
  "bar_items": [
    {
      "id": "sessions",
      "title": "Sessions",
      "description": "How many sessions are running, with red !N waiting on you, amber ·N your turn, blue …N working; an alarm while one is waiting on you; hidden with none. The popover lists them by state: Enter focuses the terminal, o opens the transcript, r copies the resume command, x kills.",
      "refresh": {
        "every": 10,
        "on": [
          "show",
          "wake"
        ]
      },
      "refresh_words": "every 10s, when the panel shows, on wake"
    }
  ],
  "has_links": true,
  "links": [
    {
      "route": "state",
      "url": "pal://sessions/state?agent=\u003cagent\u003e\u0026session=\u003csession\u003e\u0026state=\u003cstate\u003e",
      "cli": "pal call sessions/state agent=\u003cagent\u003e session=\u003csession\u003e state=\u003cstate\u003e",
      "description": "Record a session's state from a hook, for ten minutes, over what the files say",
      "params": [
        {
          "name": "agent",
          "description": "claude, codex or copilot",
          "required": true
        },
        {
          "name": "session",
          "description": "The session id the CLI gave the hook",
          "required": true
        },
        {
          "name": "state",
          "description": "working, waiting (your turn) or blocked (a prompt is up)",
          "required": true
        }
      ]
    }
  ],
  "multi": false,
  "has_readme": true
}
