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-preview0002] - 2026-07-09

### Added

- **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, message count, model, colour, and the accumulated
  cost, credits, and tokens for the conversation). Focused rows also
  support keyboard shortcuts: **Enter** opens, **F2** renames, **Delete** archives.
  Deleting a conversation is unchanged (the hover **✕**). New endpoints
  `POST /api/conversations/{id}/duplicate` and `POST /api/conversations/read-all`,
  and new `unread`/`color` fields on the conversation summary.
- **Automatic conversation titles.** A brand-new conversation is now renamed from
  the generic "New conversation" to a concise, few-word AI summary of your first
  message — the way GitHub Copilot names a new chat (for example "Stop button
  malfunction" or "Merge changes to main"). The title fills in on its own a moment
  after the first reply; renaming a conversation yourself **locks** the name so it
  is never overwritten. Backed by a new best-effort
  `POST /api/conversations/{id}/title` endpoint that runs a pure-reasoning Turn
  with all Tools disabled to summarise the first prompt.
- **Close the active project.** The composer''s project menu now offers **Close
  project** whenever a project is active, and the Settings drawer''s project list
  shows a **Close** action on the selected project. Closing deselects the project
  so no working folder is active — the file explorer collapses and the agent''s
  File/Terminal tools fall back to no default folder — while leaving the project
  registered (unlike **Remove**, which unregisters it). The closed state persists
  across sessions. Previously you could only switch to another project or create a
  new one, with no way back to a no-project state.
- **Branch Merge Wizard — merge a branch into main/master without the command
  line.** The project file explorer''s Git bar now shows, for every branch, whether
  it is already merged into the **Default Branch** (a ✓ badge) or not yet merged
  (a ❗ badge), with a hover explanation and a legend; remote-only branches are
  listed and marked. A new **“Merge into &lt;default&gt;…”** button opens a guided,
  step-by-step wizard that: previews the incoming commits (the delta); merges
  (fast-forward when possible, otherwise a merge commit); offers a one-click fix
  when the working tree is dirty or the Default Branch is behind the server
  (auto-stash + update, then merge); and, on a **merge conflict**, hands off to the
  AI to propose a **Merge Plan** that you review before anything is written
  (binary files get a simple keep-mine / keep-theirs choice). After a successful
  merge it offers to delete the local branch, and — behind a separate, explicit
  confirmation — to push the Default Branch and delete the branch on the server
  using your existing Git sign-in. Every merge can be undone within the wizard.
  Backed by new endpoints under `/api/git/*` (`branches`, `merge/preview`, `merge`,
  `merge/plan`, `merge/apply`, `merge/abort`, `merge/undo`, `cleanup`), all
  confined to the selected Project''s folder and run via a no-shell process call.
  The conflict-resolution Turn runs with all Tools disabled. Specs `070`
  (Merge Wizard) and `080` (Clone Wizard) capture the signed-off design.

### Changed

- **Smoother, faster live streaming.** The assistant''s reply now streams to the
  browser more smoothly and with less delay. The Host Server forwards streamed
  tokens on a ~10 ms cycle instead of 40 ms and coalesces a burst of tokens into a
  single update, so text appears fluidly rather than in visible chunks. The file
  explorer''s automatic 5-second refresh is also paused while a turn is streaming, so
  its directory and Git scan can no longer briefly stall the token stream (it
  refreshes once when the turn ends, as before). The Stop button and the final
  answer text are unchanged.
- **Settings are now organised into tabs.** The Settings drawer''s fields are
  grouped into six tabs — **General**, **Permissions**, **Projects**,
  **Customizations**, **Memory & context**, and **Engine & data** — shown as a
  sticky pill strip at the top of the drawer, so it stays easy to navigate as
  settings grow instead of one long scroll. Only the active tab''s fields are
  shown; every setting kee'

            Prerelease   = 'preview0002'
        }
    }
}