DeskPilot.psd1

@{
    RootModule        = 'DeskPilot.psm1'
    ModuleVersion     = '0.2.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.2.0-preview0005] - 2026-07-09

### Added

- **Automatic update checks with a consent-gated in-app update.** DeskPilot now
  polls the PowerShell Gallery for a newer release in the background (every 5
  minutes by default, configurable in **Settings → Engine & data → Updates**, plus
  a manual **Check for updates** button) and, when one is found, shows a dismissible
  banner in the UI. Clicking **Update now** installs the newest DeskPilot **and**
  ShellPilot into the CurrentUser scope, then **force-reloads ShellPilot live in the
  Engine Runspace** so the Engine update takes effect immediately; DeskPilot''s own
  host code can''t hot-swap in-process, so a one-click **Restart DeskPilot** relaunch
  applies it (a fresh process imports the updated modules, keeping your
  Conversations). Full releases are offered by default; an
  opt-in **Include preview releases** setting also considers previews, and updating
  DeskPilot to a preview accepts a preview ShellPilot too — otherwise both are
  pinned to stable. The check is fail-silent and never blocks serving (it runs in a
  background job), and the notice is web-UI only (no console output). New
  `GET /api/update`, `POST /api/update/check`, `POST /api/update/install`, and
  `POST /api/update/restart` routes; new `updateCheckIntervalMinutes` and
  `updateIncludePrereleases` Settings; new `Get-DpUpdateStatus`,
  `Invoke-DpSelfUpdate`, `Get-DpUpdatePayload`, `Update-DpUpdateCheckState`,
  `Update-DpEngineModule` (live Engine reload) and `Restart-DpHost` (relaunch)
  helpers (replacing the launch-only, console-only `Get-DpUpdateNotice`); +20 unit
  tests.
- **DeskPilot version shown in the sidebar corner.** The running version (from
  `GET /api/health`) now appears as a muted `DeskPilot vX.Y.Z` line in the
  bottom-left of the sidebar, so the installed build is always visible at a glance
  (and easy to quote alongside the update banner).
- **Set up CopilotAtelier from the Agent menu.** The Agent dropdown has a new
  **Set up CopilotAtelier…** action that provisions the
  [CopilotAtelier](https://github.com/raandree/CopilotAtelier) customization set —
  the curated agents, skills, instructions and prompt files that feed the very
  menu it lives in. Because CopilotAtelier is a repository rather than an
  installable module, DeskPilot downloads it (a zip of the `main` branch over
  HTTPS from the fixed first-party URL, extracted under the data directory) and
  runs its `Setup-CopilotSettings.ps1`, which links
  `~/.copilot/{agents,instructions,skills,prompts}` to a synced copy. It is
  deliberately **not a one-click action**: choosing the menu item first opens a
  consent dialog that spells out exactly what the script changes (the `~/.copilot`
  junctions, VS Code `settings.json`/`keybindings.json`, and the
  `COPILOT_ALLOW_ALL` user environment variable) before anything is downloaded or
  run, and the script then runs in a visible PowerShell console the user drives so
  its own safety prompts (OneDrive account choice, replacing a non-empty folder)
  work. Windows only — the script uses NTFS junctions; on other platforms the
  files are fetched for a manual run. New `POST /api/atelier/setup` route and
  `Get-DpAtelierSource` / `Invoke-DpAtelierSetup` helpers (+4 unit tests).
- **The Agent list now refreshes without a restart.** Agents that appear after
  startup — most notably from the new CopilotAtelier setup, which runs in a
  separate console — now show up in the Agent menu on their own. The SPA
  re-checks the list on a short interval and whenever the window regains focus or
  the tab becomes visible (so returning from the setup console refreshes it), and
  `GET /api/agents` now adopts the conventional `~/.copilot/agents` folder the
  moment it exists even if it was absent at startup (new `Resolve-DpAgentsRoot`
  helper), so a selected Agent also reaches the Turn. Previously the Agents folder
  was resolved once at startup, so a freshly-created `~/.copilot/agents` (e.g. the
  CopilotAtelier junction) stayed invisible until DeskPilot was restarted. Polling
  was chosen over a server-side folder watcher to fit the single-threaded,
  no-persistent-SSE Host Server. (+3 unit tests.)
- **Publishable from the PowerShell Gallery, with the web UI bundled.** The
  DeskPilot web UI now ships inside the module (ModuleBuilder `CopyPaths`), so
  `Install-Module DeskPilot; Start-DeskPilot` serves the full interface from the
  installed module with no build step and nothing extra to download. The shipped
  `Start-DeskPilot` resolves its assets internally (`$PSScriptRoot/web`) — the
  public `-WebRoot` parameter is gone — and fails fast with a clear message if the
  bundle is missing or incomplete; a source checkout and the tests serve
  `source/web` via the `DESKPILOT_WEB_ROOT` environment variable so UI edits still
  hot-reload without a rebuild. ShellPilot stays resolved at runtime by
  `Resolve-DpEngineModule` (not a hard manifest dependency, so import never fails
  when the engine is absent), and the manifest metadata (author,
  project/license/icon URIs, description, tags) is filled in for the Gallery
  listing. A fail-silent
  launch-time check reports when a newer DeskPilot is available on the Gallery.
  Added an MIT `LICENSE`, Gallery/CI README badges, a new `Get-DpUpdateNotice`
  helper, and web-asset guard tests (bundle presence, Linux case-sensitivity of
  asset references, and a no-secrets scan). The `web/` folder was relocated to
  `source/web/`.
- **Persistent memory (DeskPilot learns who you are).** DeskPilot now carries
  durable memory across conversations, injected into every turn. Two parts: a
  **User profile** — the note you write about yourself (the existing preferences,
  now framed as your profile, up to 8,000 characters) — and a new agent-curated
  **Agent memory** — durable, declarative facts the agent keeps about you and your
  environment (conventions, tools, observed preferences, lessons), up to 12,000
  characters. Both are shown as fenced *reference notes* in the system prompt so a
  recalled fact is never mistaken for a new instruction. The agent keeps its memory
  up to date two ways: **automatically** (a throttled, best-effort background step
  after some turns — default on, announced with a toast, one toggle to disable) and
  **manually** (an "Update from this conversation" button). Learning writes facts
  only, never secrets or one-off task state, and never changes your visible
  messages. Manage it all in **Settings → Memory**: view, edit, or clear either
  store, with a live character/budget count. New endpoints `GET`/`PUT /api/memory`
  and `POST /api/memory/learn`; new helpers `Get-DpMemoryLimits`,
  `Import-DpMemoryStore`, `Save-DpMemoryStore`, `New-DpMemoryPrompt`,
  `ConvertFrom-DpMemoryResult`, `Get-DpMemoryPayload`; a new `agent-memory.json`
  store and a `memoryLearning` setting (+17 unit tests).
- **Automatic conversation compaction (Memory & context).** When a conversation
  fills most of the model''s context window, DeskPilot can now summarise its earlier
  turns automatically so it keeps working instead of overflowing — the same
  summarise-and-keep-recent **Compact** it already offered, run for you after a turn
  once the context passes a threshold you set. Your visible messages are always
  kept, and every automatic compaction is announced with a toast. New **Memory &
  context** settings: an on/off toggle (default **on**), a **Compact when context
  reaches** percentage (50–95, default 80), and **Recent messages to keep in full**
  (2–100, default 4). The same keep-recent setting now also drives the manual
  Compact action. No new endpoint — auto-compaction reuses
  `POST /api/conversations/{id}/compact`. The Session Info panel shows a one-line
  indicator when auto-compaction is on. (+6 unit tests.)
- **Richer Usage panel.** The credits/usage popover now shows the **tokens in /
  tokens out** split (prompt vs. completion) for both the session and all-time
  counters, a **Top models** list for the session (ranked by tokens), and the
  credits-per-day chart gained a **30-day** range alongside 7d and 14d. All from
  data already tracked — no extra cost or Engine change.
- **Session info + Compact conversation (like GitHub Copilot).** Each conversation
  now has a **Session Info** panel — opened from a glanceable **context meter**
  pill in the top bar or the **⋯** menu — showing the conversation''s accumulated
  cost (credits and $) and turn count, and a **Context Window** gauge: how much of
  the model''s context window the last turn used, with a hatched *reserved for
  response* tail and an estimated split into **Messages** vs. **System + tools**.
  The context figure is measured exactly from the Engine''s reported `promptTokens`;
  the per-part breakdown is a labelled client-side estimate. A **Compact
  conversation** button summarises the earlier turns into a short briefing so
  future turns send far fewer tokens — your visible messages stay intact; only what
  is replayed to the model shrinks. New endpoint
  `POST /api/conversations/{id}/compact` (runs a pure-reasoning turn with all tools
  disabled) and a new `compactedUtc` conversation field. New helpers
  `New-DpCompactionPrompt`, `ConvertFrom-DpCompactionResult`, and
  `Compress-DpConversationHistory` (+16 unit tests).
- **A richer conversation menu.** The per-conversation **⋯** menu is now grouped
  into clear sections with several new actions: **Open in new window** (opens the
  conversation in a separate browser window via a `/?c=<id>` deep link),
  **Duplicate** (an independent copy of the title, messages, and history),
  **Mark as unread** / **Mark as read** with an unread dot, a bold title, and a
  **Mark N as read** control under the list, an optional **Colour** label from a
  fixed palette (shown as a dot on the row), **Copy transcript** (the Markdown
  transcript straight to the clipboard), and **Details** (a read-only popover with
  the created/updated times, messa'

            Prerelease   = 'preview0005'
        }
    }
}