mirror of
https://github.com/davidkaya/aryx.git
synced 2026-07-28 23:48:39 +02:00
Backend (sidecar): - Extended ProtocolModels with DTOs for custom agents, hooks, skills, infinite sessions, session lifecycle, and 9 new event types - Added CopilotManagedSessionIds for stable SDK session ID mapping - Added CopilotSessionManager/ICopilotSessionManager for session lifecycle - Added CopilotSessionHooks for hook registration - Added CopilotMessageOptionsMetadata for mid-turn steering - Extended CopilotAgentBundle to wire custom agents, hooks, skills, infinite sessions, and stable session IDs - Extended CopilotTurnExecutionState to project 13 new SDK event types - Widened ITurnWorkflowRunner callback to accept SidecarEventDto - Added list/delete/disconnect session commands to SidecarProtocolHost - Added AryxCopilotAgentMessageOptionsTests (14 new tests, 142 total) Frontend (renderer + main + shared): - Added ChatMessageAttachment type and helpers (attachment.ts) - Extended sidecar contracts with MessageMode, 3 new command types, 9 new event types, and agent/session config DTOs - Extended SessionEventRecord with 6 new event kinds and ~20 fields - Added PatternAgentCopilotConfig to pattern domain - Added attachments support to ChatMessageRecord - Updated sidecar client with session lifecycle methods and turn-scoped event routing via onTurnScopedEvent callback - Updated main process: handleTurnScopedEvent(), deleteSession(), steering bypass for mid-turn messages, attachment passthrough - Added deleteSession IPC handler and preload binding - Added TurnEventLog state tracker with format/apply/prune helpers - ChatPane: always-enabled composer, steering indicator, attachment picker with preview, image thumbnails in message history, context-usage bar, amber steer mode for send button - ActivityPanel: turn events section with sub-agent, hook, skill, and compaction event rendering - Sidebar: delete session action in context menu - App.tsx: wired sessionUsage, turnEventLogs, and deleteSession Documentation: - AGENTS.md: added glob safety rule for node_modules - README.md: added steering, image input, and richer observability - ARCHITECTURE.md: added turn-scoped events, steering, and attachments - Website: added steering and image input feature cards, updated live visibility and session cards Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import { describe, expect, test } from 'bun:test';
|
|
|
|
import {
|
|
markRunTurnPendingErrored,
|
|
shouldHandleRunTurnEvent,
|
|
type RunTurnPendingCommand,
|
|
} from '@main/sidecar/runTurnPending';
|
|
|
|
describe('run turn pending helpers', () => {
|
|
test('marks a run-turn pending command as errored and rejects it once', () => {
|
|
const rejected: Error[] = [];
|
|
const pending: RunTurnPendingCommand = {
|
|
kind: 'run-turn',
|
|
resolve: () => undefined,
|
|
reject: (error) => rejected.push(error),
|
|
onDelta: () => undefined,
|
|
onActivity: () => undefined,
|
|
onApproval: () => undefined,
|
|
onUserInput: () => undefined,
|
|
onExitPlanMode: () => undefined,
|
|
onMcpOAuthRequired: () => undefined,
|
|
onTurnScopedEvent: () => undefined,
|
|
errored: false,
|
|
};
|
|
|
|
const first = markRunTurnPendingErrored(pending, 'boom');
|
|
const second = markRunTurnPendingErrored(pending, new Error('later'));
|
|
|
|
expect(first).toBeInstanceOf(Error);
|
|
expect(first.message).toBe('boom');
|
|
expect(second.message).toBe('later');
|
|
expect(pending.errored).toBe(true);
|
|
expect(rejected).toHaveLength(1);
|
|
expect(rejected[0].message).toBe('boom');
|
|
});
|
|
|
|
test('stops handling turn events after the pending command has errored', () => {
|
|
const pending: RunTurnPendingCommand = {
|
|
kind: 'run-turn',
|
|
resolve: () => undefined,
|
|
reject: () => undefined,
|
|
onDelta: () => undefined,
|
|
onActivity: () => undefined,
|
|
onApproval: () => undefined,
|
|
onUserInput: () => undefined,
|
|
onExitPlanMode: () => undefined,
|
|
onMcpOAuthRequired: () => undefined,
|
|
onTurnScopedEvent: () => undefined,
|
|
errored: false,
|
|
};
|
|
|
|
expect(shouldHandleRunTurnEvent(pending)).toBe(true);
|
|
|
|
markRunTurnPendingErrored(pending, new Error('boom'));
|
|
|
|
expect(shouldHandleRunTurnEvent(pending)).toBe(false);
|
|
});
|
|
});
|