Wire the sidecar user-input-requested protocol event through the main
process, IPC layer, and renderer UI so agents can ask the user
interactive questions with choices and freeform input.
- Add UserInputRequestedEvent and ResolveUserInputCommand to sidecar
protocol types
- Add resolveUserInput method to SidecarClient and onUserInput callback
to runTurn
- Create PendingUserInputRecord domain type and add pendingUserInput to
SessionRecord
- Add handleUserInputRequested and resolveSessionUserInput to
AryxAppService with handle management
- Register sessions:resolve-user-input IPC channel with preload bridge
- Create UserInputBanner component with choice buttons and freeform
input
- Integrate UserInputBanner into ChatPane with header indicator
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Implement the Copilot SDK user input round-trip in the backend:
- add user-input-requested and resolve-user-input protocol DTOs
- add a CopilotUserInputCoordinator that mirrors approval flow with
pending TaskCompletionSource state and explicit resolution
- wire SessionConfig.OnUserInputRequest through CopilotAgentBundle
and CopilotWorkflowRunner
- extend SidecarProtocolHost to emit user input events, accept
resolve-user-input commands, and filter ask_user from runtime
approval tools
- add regression tests for the new coordinator and protocol flow
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Expose SDK permission request details on approval-requested events via a
new permissionDetail payload. This preserves the existing title/detail
summary while carrying the command, URL, diff, args, and other
kind-specific data needed for richer approval UI in the renderer.
Also adds sidecar coverage for all supported permission request kinds and
verifies the new payload serializes over the protocol.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
ISCC's /D command-line flag combined with Node.js spawn on Windows
produces broken ISPP defines due to argument quoting conflicts.
Switch to environment variables read via GetEnv() — robust and
avoids all quoting issues. Product name and publisher are now
hardcoded in the ISS (they never change).
Verified: installer shows 'Aryx' and correct version in metadata.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Switch from NSIS (early 2000s) to Inno Setup 6 — the modern standard
used by VS Code and most Electron apps. Features:
- Modern wizard UI (WizardStyle=modern)
- LZMA2/ultra64 solid compression (138.9 MB, down from 143 MB with NSIS)
- Per-user install to %LOCALAPPDATA%\Programs\Aryx (no admin needed)
- Optional desktop shortcut, Start Menu group
- Auto-closes running instance before install/uninstall
- Proper Add/Remove Programs integration via AppId
- Launch-after-install option
CI updated to install Inno Setup via Chocolatey on windows-latest.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Windows: add NSIS installation step via Chocolatey in CI workflow
- macOS: fix create-dmg CLI invocation to match sindresorhus package
API (--overwrite, --no-version-in-filename, --no-code-sign) and
rename output to expected asset name
- Add rename import to create-installer.ts
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace zip/tar archive distribution with platform-native installers:
- Windows: NSIS installer (.exe) with per-user install to
%LOCALAPPDATA%\Programs\Aryx, Start Menu and Desktop shortcuts,
Add/Remove Programs registration, and silent install support
- macOS: DMG disk image (.dmg) with drag-to-Applications experience
via create-dmg
- Linux: Debian package (.deb) with /opt/aryx installation,
/usr/bin/aryx symlink, desktop entry, hicolor icons, and
libsecret-1-0 dependency declaration
Add scripts/create-installer.ts as the platform-dispatching entry
point. Update CI workflow to produce native installers instead of
archives. Add installerAssetName to ReleaseTarget interface.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Enable PublishTrimmed with TrimMode=partial to remove unused
framework assemblies while preserving app/SDK code safety
- Enable PublishSingleFile to bundle all managed assemblies into
one executable (sidecar goes from 254 files to 2 files)
Sidecar shrinks from 191 MB / 254 files to 134 MB / 2 files.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Move 15 renderer-only dependencies to devDependencies since they are
already bundled by Vite (197 → 37 runtime deps)
- Pack app resources into asar archive with native addon unpacking
- Strip unused Electron locale files, keeping only en-US
- Remove non-essential Electron files (LICENSES.chromium.html, LICENSE)
- Remove default_app.asar from Electron distribution
- Strip .NET sidecar localization satellite assemblies (en only)
Release artifact shrinks from 607 MB / 10,525 files to 478 MB / 235 files.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use createRequire for node:child_process so Bun on macOS can load gitService without ESM export-shape issues.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Resolve execFile from named or default child_process exports so macOS Bun can load gitService in tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Single-page marketing site built with Astro 5 and Tailwind CSS v4.
Produces static HTML with zero client-side JS — ideal for Cloudflare
Pages deployment.
Sections: hero with screenshot placeholder, 6 feature cards,
5 orchestration patterns showcase, 4-step getting started guide,
tech banner, and footer.
Dark theme (zinc-950/indigo accents) matches the app aesthetic.
Responsive design with mobile navigation.
Build: cd website && bun install && bun run build
Output: website/dist/
To add a real screenshot, replace
website/public/images/screenshot-placeholder.svg with
website/public/images/screenshot.png and update the img src
in website/src/pages/index.astro.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Generalize the scratchpad-only model/reasoning-effort selector to work
in any session whose pattern has exactly one agent. This enables model
switching above the chat input for project 1-on-1 chats, not just
scratchpads.
- Rename ScratchpadSessionConfig -> SessionModelConfig across domain,
contracts, IPC, preload, and renderer
- Replace isScratchpadProject guard with agents.length === 1 check in
EryxAppService.updateSessionModelConfig and ChatPane pills gate
- Apply session model config in buildEffectivePattern whenever present,
regardless of project type
- Seed sessionModelConfig on session creation for any single-agent
pattern
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Clear only active agent statuses when a session reaches idle, and keep the terminal cancelled/error run cleanup in place. Add regression coverage for idle cleanup after cancellation-like flows.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Clear only still-active side-panel agent states when a run ends as cancelled or error, while preserving completed agent statuses. Add a renderer regression test for cancelled runs.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Adds cancel-turn IPC channel, SidecarClient.cancelTurn(), TurnCancelledError,
EryxAppService.cancelSessionTurn(), finalizeCancelledTurn(), stop button in
ChatPane, and cancelled run status throughout the run timeline.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Resolve chat tooling from the selected session's project instead of the
separately tracked selectedProjectId so project-scoped discovered MCPs do
not appear for the wrong session. Also synchronize selectedProjectId when
a session is selected and add regression tests for both behaviors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the Tool Auto-Approval Defaults section into the tool-call
ApprovalCheckpointRow card so the tool list appears directly under
the toggle instead of in a disconnected section below. Extend
ApprovalCheckpointRow with an optional children prop rendered
inside the card when the checkpoint is enabled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add a Troubleshooting section under a Support nav group in Settings:
- Open App Data Folder: reveals the user-data directory in the OS file
explorer via shell.openPath.
- Reset Local Workspace: destructive action that deletes workspace.json
and scratchpad contents, clears the in-memory cache, and reseeds
defaults. Auth secrets are preserved. Requires two-step confirmation.
New IPC channels, ElectronApi methods, and preload bridge added for
openAppDataFolder and resetLocalWorkspace. Existing electron mock in
tests updated to include shell.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Remove .pill-trigger CSS class and restore the idiomatic Tailwind v4
@theme approach: --text-pill in @theme generates the text-pill utility.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The @theme --text-pill token and text-[8px] arbitrary value both
failed to apply at dev time due to @tailwindcss/vite not generating
the utility rule during HMR. Use a plain .pill-trigger CSS class
in styles.css instead, which is always available regardless of
Tailwind's JIT scanner behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The arbitrary text-[8px] class was not being generated by the
Tailwind v4 Vite plugin at dev time. Register --text-pill in
@theme so text-pill becomes a first-class utility that is always
generated. Uses 0.5rem (8px) with line-height 1.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add explicit leading-none alongside text-[8px] so both font-size
and line-height shrink, making the size reduction visually apparent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reduce font to text-[8px], restore icons to size-2.5 for legibility,
and bump padding to px-1.5 py-0.5 so icons aren't flush with the
pill border.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Shrink padding (px-2 py-1 → px-1.5 py-0.5), font (12px → 11px),
gap (1.5 → 1), icon size (3 → 2.5), and model name max-width
(140px → 120px) on all four pill trigger buttons. Dropdown popovers
remain unchanged.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The useCallback for handleCreateScratchpad was placed after the early
return for the loading state, causing React to see a different number
of hooks between the initial render (workspace undefined) and subsequent
renders. Move it before the guard and add a null check inside instead.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>