One prompt. Every place you work.

How Parked Prompts connects to VS Code chat, the Agents window, Copilot canvases, Git, and your repository.

At a glance

What works where

VS Code and Copilot allow different things in each place, so each surface does what it can, and says so when it can't.

What you can doChat viewAgents windowCopilot canvas
Write a prompt with images and filesSidebar composerText, then pick filesComposer in the canvas
Restore into the chat input, unsentWith attachmentsText, with files by pathNo: it sends instead
Park what you typed in chatText onlyText onlyNo
Send now, or queue after this turnNoNoYes
Send when the agent goes idleNoNoYes, while it stays open
Run in a new worktreeYesNot tested yetNo
Move to the repository to shareYesNot tested yetYes
Agent can list, read, and save draftsNoNoYes, but never send

Chat view

VS Code has no API for the chat input, so restoring goes through one small adapter that calls its chat commands.

  • A new chat is the default, because filling an input replaces what's there
  • Restoring to the current chat warns first, if it finds text you typed
  • A file that's gone is flagged, rather than silently left out
VS Code with a prompt restored into the chat input, with a file range and an image attached, and a notification that it has not been sent.
The packaged extension in VS Code Insiders 1.146.
// isPartialQuery is what keeps it from sending.
await commands.executeCommand('workbench.action.chat.newChat');
await commands.executeCommand('workbench.action.chat.open', {
  query: prompt.body,
  isPartialQuery: true,
  attachFiles: [uri, { uri, range }],
});

Agents window

The same chat command is registered in this window but does nothing there, which we only found by running it. So the extension detects the window and uses the one that works.

  • No setting to change: the manifest declares support for this window
  • This command takes text only, so files are listed by absolute path
  • There are no sidebar views here, so it uses quick picks and input boxes
The Agents window composer holding a restored prompt, with a notification that it has not been sent.
The Agents window in VS Code Insiders 1.146.
// Without prefillPrompt, this command sends. A test pins it down.
await commands.executeCommand('workbench.action.sessions.newChat', {
  prompt: textWithFilePaths,
  prefillPrompt: true,
});

Copilot canvas

A canvas is a panel that belongs to a Copilot session, so unlike an extension it can see when the agent is busy and can deliver a message with attachments.

  • Built with canvas-kit, in TypeScript and React, and tested in light, dark, and high contrast
  • Follows the store on disk, so prompts parked in the editor appear here live
  • Every send or arm action is only available to the page, never the agent
The Parked prompts canvas with Send, Queue, and When idle buttons. The Parked prompts canvas with Send, Queue, and When idle buttons.
The built plugin in a browser, with the agent simulated. A live session is still to be checked.
// expose: 'ui' means the agent never gets this as a tool.
send_now: action({
  description: 'Send a prompt to this session now.',
  expose: 'ui',
  input: promptRef,
  run: async (ctx, ref) => {
    const prompt = await getPrompt(ctx.state.repo, ref)
    await assertConfirmed(ctx.state.repo, prompt)
    await deliver(ctx, prompt, 'immediate', ctx.now())
  },
})

Git worktrees

When you don't want to wait, a worktree gives the prompt its own folder and branch. It takes only stable VS Code APIs and plain Git, and your attachments come along.

  1. Confirm the branch and folder, then it runs git worktree add
  2. It leaves a one-time marker in the store, and opens the folder in a new window
  3. That window takes the marker and restores the prompt into a new chat, unsent
A new VS Code window opened on the worktree folder, with the prompt restored into its chat input and a notification that it has not been sent.
The new window, with the prompt waiting and the first checkout untouched.

Your repository

Commit a prompt to .github/parked-prompts/ and your team has it too: a release checklist, a migration, or a review you want done the same way each time.

  • Moving lists exactly what will be added, and warns about screenshots and secrets
  • Your local path is removed, and nothing is committed for you
  • Everyone else reads it and says yes first. Here's why
A read-only preview of a repository prompt, behind a dialog asking whether to use it.
A prompt that arrived by Git, shown read-only before it can be used.

How they connect

They don't talk. They share a folder.

The extension and the canvas never call each other. Both read the same files through the same small library, so a prompt is just a folder you can read yourself.

# Personal prompts, private to your user
~/.parked-prompts/
  20261105-160520-a1b2c3/
    prompt.md            # Frontmatter, then the prompt as you wrote it
    attachments/
      login-error.png    # Images and outside files are copied in

# Shared prompts, committed by you
your-repo/.github/parked-prompts/
  20261105-160520-a1b2c3/
    prompt.md

How we know

Run on real builds, not guessed from docs.

These chat commands are internal to VS Code, so every assumption was tested against the real product before anything was built on it, and a harness re-checks them on new builds.

Read the test results