Add backup-key.ts that generates a random 256-bit key on first use and
persists it via safeStorage + electron-store (same pattern as token.ts).
Remove _cachedPassword and getCachedPassword() from AuthManager — they
were unused since BackupManager does not exist yet. Social-login users
can now use backup features without being tied to a password.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace generic star icon and "Adiuva" text with new compass mark and
"adiuvAI" wordmark across sidebar, login form, and AI chat header.
Add app icon (PNG/ICO) and configure Forge packager and BrowserWindow.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Constrain SidebarProvider to h-full to close height chain
- Replace Radix ScrollArea in ProjectSidebar with overflow-y-auto div
(Radix needs explicit pixel height; flex-1 alone is unreliable)
- Add min-h-0 to ProjectSidebar root to allow flex shrink
- Style native webkit scrollbar to match shadcn ScrollBar component
(w-2.5, bg-border thumb, rounded-full, transparent track/corner)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove isApproved column from tasks DB schema and migration; drop column on startup
- Remove isApproved from tRPC router (list, create, update queries)
- Remove isApproved filter from KanbanBoard and ProjectDetail approve/reject UI
- AI-generated tasks now auto-approved; show Sparkles icon via isAiSuggested flag
- Fix tasks page width overflow: add min-w-0 to SidebarInset in AppShell
- Fix task title overflow: truncate with ellipsis inside TaskRow
- Fix tasks toolbar layout: shrink-0 on right side, fixed w-56 on search input
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The manual 'Run now' path was missing both agentId in the trigger
request (so BE couldn't echo it in run_context) and the agentRuns
insert after the trigger responded, so manually-triggered runs never
appeared in the history sheet.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Create the agentRuns row immediately after the trigger POST responds,
before any tool calls arrive. This ensures runs with zero mutations
(agent found nothing to create/update) still appear in the history sheet.
Removed the redundant onConflictDoNothing guard from recordRunAction
since the row is guaranteed to exist by trigger time.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wrap the async db.update in void (async () => {})() like the tool_call
case does — the ws.on('message') callback is synchronous.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- agent.runs tRPC procedure now queries local SQLite agentRuns table
(previously fetched from backend) and joins action counts per run
- agent.runActions procedure added for lazy-loading individual actions
when a run is expanded in the sheet
- AgentRunHistorySheet: slide-in sheet opened via History button on the
agent card; shows runs with status/duration/action summary; each run
is expandable to list individual actions (created/updated/deleted)
with entity type and title
- AgentRow: adds History button, removes embedded AgentRunLog from
expanded config section
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Protocol:
- RunContextSchema added to api-types — attached to WsToolCall frames
originating from batch runs; type/runId/agentId identify the run
- WsRunCompleteSchema added — server sends this when a batch run ends
Database:
- agent_runs table: one row per run (id, agentId, status, startedAt, completedAt)
- agent_run_actions table: one row per mutating tool call
(verb: created/updated/deleted, entityType, entityId, entityTitle)
Logging logic (backend-client.ts):
- On tool_call with runContext: ensure agentRuns row exists, insert
agentRunActions for insert/update/delete actions
- On run_complete: update agentRuns status and completedAt
Scheduler passes agentId in the trigger POST so the backend echoes it
back in run_context for correct attribution.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Prevents large tool_result payloads from flooding the dev console.
Both send and receive logs now append … when the serialised frame
exceeds 200 characters.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Split monolithic settings.tsx (~1500 lines) into focused components under
src/renderer/components/settings/: GeneralSection, AccountSection,
AgentsSection, AgentRow, LocalAgentConfigPanel, CloudAgentConfigPanel,
TemplateSelectCard, PromptBuilderChat, InlineAgentCreationStepper,
JourneyDialog, SettingsCard, and shared types/constants
- Hide agents list while creation stepper is open
- Use ScrollArea (app scroll primitive) in PromptBuilderChat
- Fix done-state handling: filter empty AI messages, show hardcoded
confirmation bubble only once, move saved badge below chat, keep
input enabled after prompt is saved so user can keep refining
- Wrap LocalAgentConfigPanel footer buttons with flex-wrap for narrow cards
- Update Agents section title/subtitle copy
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Upgrade shadcn from 3.8.5 to 4.0.8
- Add missing session_id parameter to sendHomeRequest calls in orchestrator
- Update skills-lock.json computed hashes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rewrite PromptBuilderChat to use real WS journey mutations with
button-to-start pattern, loading states, and markdown rendering
- Add isDone state to both PromptBuilderChat and JourneyDialog so
input is disabled and a confirmation banner shown after prompt generation
- Extract and save promptTemplate via onPromptUpdate when BE sends done=true
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the old single-pass FE file-reader flow (agent_run → agent_data →
agent_complete) with a BE-orchestrated two-phase execution where the BE's LLM
calls filesystem tools on the FE via tool_call/tool_result WS round-trips.
Key changes:
- Remove deprecated file-reader.ts and agent_run/agent_data/agent_complete frames
- Add list_directory, read_file_content, get_file_metadata handlers to DrizzleExecutor
- Migrate journey setup from REST to WebSocket (journey_start/message/reply frames)
- Store agent configs locally in electron-store (no longer on BE)
- Add agent scheduler for periodic auto-trigger via POST /agents/trigger
- Update device_hello to use local agent configs
- Remove fileExtensions from agent config, switch to single directory path
- Add agent.canCreate quota check mutation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Floating chat: reset session_id only on user-initiated page navigation,
not when closed via X/Escape (session persists for reopening same context)
- Home buttons (sidebar trigger + new chat): add frosted glass background
so they remain legible when chat messages scroll behind them
- Daily brief toast: match frosted glass opacity/blur to button treatment
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>