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-preview0003] - 2026-07-09 ### Added - **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, 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 me' Prerelease = 'preview0003' } } } |