DeskPilot.psd1

@{
    RootModule        = 'DeskPilot.psm1'
    ModuleVersion     = '0.4.0'
    GUID              = 'b8f3a2d1-7c4e-4a9b-9f1d-2e6c5a0b3d77'
    Author            = 'Raimund Andree'
    CompanyName       = 'Raimund Andree'
    Copyright         = '(c) Raimund Andree. MIT licensed.'
    Description       = 'DeskPilot is a local, desktop-style web UI that fronts the ShellPilot engine to give non-technical users the full GitHub Copilot agent toolset (browse, read/write files, run commands, skills, instructions) with visible permissions and honest cost - no terminal or IDE required. The web UI is bundled in the module and served on loopback; ShellPilot and a Copilot-enabled GitHub account are required.'
    PowerShellVersion = '7.0'
    FunctionsToExport = 'Start-DeskPilot'
    CmdletsToExport   = @()
    VariablesToExport = @()
    AliasesToExport   = @()
    PrivateData       = @{
        PSData = @{
            Tags         = @('Copilot', 'GitHubCopilot', 'ShellPilot', 'Agent', 'AI', 'GUI', 'AgenticOperatingModel', 'PSEdition_Core', 'Windows', 'Linux', 'macOS')
            LicenseUri   = 'https://github.com/raandree/DeskPilot/blob/main/LICENSE'
            ProjectUri   = 'https://github.com/raandree/DeskPilot'
            IconUri      = 'https://raw.githubusercontent.com/raandree/DeskPilot/main/source/web/assets/logo-mark.png'
            ReleaseNotes = '## [0.4.0] - 2026-08-09

### Added

- **Asking for choices now gets you choices.** "Give me a list to choose from"
  or "what are my options" used to be answered with a written list you could only
  read. The agent now offers those as a real question you can answer — a
  questionnaire in the window, tappable buttons on your phone — so picking one
  actually carries on the conversation. It still will not turn a simple request
  into a wizard: it never asks to confirm something it can just do.
- **Tap to answer, instead of typing.** When the agent asks a question with a
  list of choices, Telegram now shows a button for each one — tap it and that is
  your answer. `/chats` gives you a button per conversation too, so switching no
  longer means reading a list and typing a number. You can still reply in writing
  whenever you prefer, and questions that let you pick several answers at once
  still ask for a written reply, because one tap cannot say "these two".
- **Rewind a conversation to before a prompt.** Every message you send now
  carries a **Restore Checkpoint** marker above it. Clicking it takes you back to
  the moment just before you hit send: the message and everything after it leave
  the conversation, your prompt goes back into the box so you can reword it, and
  any file DeskPilot changed since is put back the way it was. Files you edited
  yourself are left alone, and DeskPilot asks before it discards anything. The
  marker appears as soon as the turn finishes — you do not have to reopen the
  conversation to see it.
- **Undo from your phone.** Send `/undo` to Intercom and DeskPilot tells you
  exactly what it would throw away — how many messages, how many files — then
  waits. `/undo confirm` takes you back to just before your last instruction,
  puts back the files it changed, and sends your prompt back so you can reword it
  and try again. It refuses while a job is running, so send `/stop` first.

### Fixed

- **Undoing a file now clears it from the review list.** The diff viewer kept the
  file list it opened with, so after you confirmed an undo the file was still
  listed, still showed its old diff, and still offered a second **Undo this
  file** for a change that was already gone. The viewer now re-reads the change
  set after every Keep or Undo: a file that no longer differs drops out, the
  selection moves to the next file, and the viewer closes when nothing is left
  to review. A file put back through Git also stops being reported as an
  unreviewed DeskPilot change.
- **The window keeps up with your phone.** Archiving, unarchiving, deleting or
  starting a conversation from Telegram now updates the DeskPilot sidebar within
  a few seconds, instead of leaving a deleted conversation listed and
  unclickable. Clicking a conversation that has since gone says so and refreshes
  the list, rather than doing nothing at all.
- **An archived conversation no longer accepts new work.** Sending, regenerating
  or editing a turn in an archived conversation — from the window or from your
  phone — is refused with a message telling you to unarchive it first. Archiving
  is you saying you are done with it.
- **Deleting the conversation your phone was working in is now an error.**
  Intercom used to fall through to "the most recent one" and quietly do the work
  somewhere you never chose. It now refuses and asks you to pick one with
  `/chats` or start one with `/new`.
- **Deleting a conversation asks first.** The ✕ button beside a conversation now
  **archives** it (reversible); deleting moved into the ⋯ menu — also reachable
  by right-clicking the row — and always confirms.
- **Linking your phone to Intercom no longer requires hunting for a chat id.**
  Intercom ignores every chat until you confirm one, which meant your bot stayed
  silent — even to `/start` — and there was no way to discover the number from
  it. **Settings → Intercom → Link my phone** now listens for five minutes,
  shows you the message it saw, and links the chat when you click **This is me**.
  Nothing is ever linked automatically, and nothing you send during that window
  is executed.
- **A model with no published rate no longer reads as free.** The engine prices a
  turn from a table keyed by exact model id; a model newer than that table (for
  example `claude-opus-5`) comes back with *no* price, and DeskPilot was showing
  that as a confident `$0.0000 · 0 credits` — over a million tokens could look
  free. Such a turn now says **cost unknown — no published rate for this model**,
  session and all-time totals show a `≥` prefix and count how many turns could
  not be priced, and the per-model list says **no rate** instead of `0 cr`. The
  fix for the *number* is a rate for the model in the engine''s price table; this
  fix is DeskPilot no longer misreporting its absence.

### Added

- **Copy your own messages with one click.** Hovering a message you sent now
  shows a ⧉ button beside the edit one, the same as on DeskPilot''s replies — no
  more selecting a prompt by hand to reuse it. Both also fall back to an older
  copy method if the browser refuses clipboard access.
- **Send files from your phone.** Attach a document, photo, voice note or video
  in Telegram — with or without a caption — and DeskPilot saves it into your
  project folder and puts the agent to work on it; photos also go to the model''s
  vision input. Previously an attachment was ignored without so much as a reply.
  Files up to 20 MB (Telegram''s own limit), and only from a project with **allow
  phone control** ticked.
- **Choose how a message is sent.** **Settings → General → Send a message with**
  offers **Ctrl+Enter** (the new default, with Enter making a new line) or
  **Enter** (with Shift+Enter making a new line). Ctrl+Enter by default so a
  stray Enter mid-thought cannot fire a half-written instruction at an agent that
  can change files and run commands.
- **Tidy up conversations from your phone.** `/archive 2` hides one from the
  list, `/unarchive 2` brings it back, and `/chats all` lists the archived ones
  so you can see their numbers; `/delete 2` removes one for good and asks you to
  confirm first, offering `/archive` as the reversible alternative.
- **Watch a phone-driven job from the machine.** While a job you sent from
  Telegram is running, the DeskPilot window marks that conversation and shows the
  answer being written — including the model''s thinking when that is switched on.
  No page refresh.
- **Telegram messages are formatted properly.** The agent writes Markdown and
  Telegram renders none of it, so answers used to arrive as a wall of `##`, `**`
  and pipe-delimited tables. Headings, bold, bullets, links, code and tables now
  come through readable, and a message Telegram cannot render is resent as plain
  text rather than lost. Telegram has no tables at all, so a narrow one is shown
  as an aligned block and a wide one as one labelled record per row — long tables
  are trimmed with a note pointing you back to DeskPilot for the rest.
- **Switch conversations from your phone.** Intercom gains `/chats` to list your
  conversations (newest first, marking the one you are in), `/chat 2` to switch
  to one, and `/new` to start a fresh one. Asking the *agent* to switch chats
  never worked and never could — which conversation is open is DeskPilot''s state,
  not something the agent can see or change. Listing and switching run nothing,
  so they work even when no project is open; `/new <text>` still needs a project
  with **allow phone control** ticked, because that runs work.
- **Reach DeskPilot from your phone (Intercom).** When the agent needs an
  answer, finishes, fails, or goes quiet, DeskPilot messages you on Telegram —
  and you can reply to answer it, send a new instruction, `/stop` the job,
  `/steer` it somewhere else, or `/new` a fresh conversation, without a remote
  desktop session. It is **off by default** and stays off for every project until
  you tick **allow phone control** on that project, so nothing can be driven
  remotely by accident. Exactly one Telegram chat is allowed; anything else is
  counted and thrown away without being read as an instruction. The bot token is
  encrypted for your Windows account in its own file, so a settings backup can
  never carry it. DeskPilot also keeps one silently-updating status message on
  your phone that always states the time of its next check-in — if that time has
  passed, DeskPilot has stopped. Set it up under **Settings → Intercom**; the
  [getting-started guide](docs/intercom-getting-started.md) walks through it.
- **The files panel is resizable.** Drag its left edge to make it as wide as you
  need (up to 60 % of the window), double-click the edge to snap back to the
  default, or focus it and use `←`/`→` — `Shift` for bigger steps, `Home` to
  reset. The width is remembered on this machine.
- **Save all your changes at once, without knowing Git.** The Changes panel gains
  a **Save all…** button (also in the Branch Wizard when you have unsaved work,
  and in the command palette) that opens one dialog: it lists every uncommitted
  file with its added and removed line counts, prefills an editable one-line
  description, and records the lot as a single entry in the project''s history.
  No staging, no `git add`, no terminal — and nothing is sent anywhere until you
  choose **Send to server**. Saving a file also stops DeskPilot reporting it as
  an unreviewed change, because a file you saved is a file you reviewed.
- **Let DeskPilot write the description.** A ✨ button beside the box reads your
  changes and suggests a one-line description, the way GitHub Copilot''s commit
  box does. It only ever fills the box — you read the words and decide — and it
  runs on your click, never on its own.
- **DeskPilot now remembers what it changed until you decide.** Before every turn
  it records how your files looked, so the edits the agent makes stay listed as
  *not reviewed yet* — across a reload,'

            Prerelease   = ''
        }
    }
}