* Extract client SDK package * Polish SDK client identity defaults * Build client before dependent CI jobs * Restore daemon client server export * Extract protocol and client SDK packages * Fix provider override schema validation * Fix app test daemon client imports * Simplify workspace build targets * Fix CLI test server build bootstrap * Run SDK package tests in CI * Fix rebase package split drift * Restore lockfile registry metadata * Update SDK config test for prompt default * Move terminal stream router test to client package * Fix rebase drift for protocol imports * Fix SDK agent capability fixture * Restore legacy server client exports * Fix server export compatibility test * Advertise custom mode icon client capability * Remove server daemon-client exports * Format rebased mode control import * Fix rebase drift for protocol imports Files added by upstream PRs (#893, #1147, #1154) referenced the pre-split shared/ paths that this branch moves into @getpaseo/protocol. Redirect those imports to the protocol package so typecheck stays green after the rebase.
64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
import { useMemo } from "react";
|
|
import { View } from "react-native";
|
|
import { StyleSheet, useUnistyles } from "react-native-unistyles";
|
|
import {
|
|
AGENT_LIFECYCLE_STATUSES,
|
|
type AgentLifecycleStatus,
|
|
} from "@getpaseo/protocol/agent-lifecycle";
|
|
import { deriveSidebarStateBucket } from "@/utils/sidebar-agent-state";
|
|
import { getStatusDotColor } from "@/utils/status-dot-color";
|
|
|
|
export function AgentStatusDot({
|
|
status,
|
|
requiresAttention,
|
|
attentionReason,
|
|
pendingPermissionCount,
|
|
showInactive = false,
|
|
}: {
|
|
status: string | null | undefined;
|
|
requiresAttention: boolean | null | undefined;
|
|
attentionReason?: "finished" | "error" | "permission" | null;
|
|
pendingPermissionCount?: number;
|
|
showInactive?: boolean;
|
|
}) {
|
|
const { theme } = useUnistyles();
|
|
|
|
if (!status) {
|
|
return null;
|
|
}
|
|
if (!isAgentLifecycleStatus(status)) {
|
|
return null;
|
|
}
|
|
|
|
const bucket = deriveSidebarStateBucket({
|
|
status,
|
|
requiresAttention: Boolean(requiresAttention),
|
|
attentionReason: attentionReason ?? null,
|
|
pendingPermissionCount: pendingPermissionCount ?? 0,
|
|
});
|
|
const color = getStatusDotColor({ theme, bucket, showDoneAsInactive: showInactive });
|
|
|
|
if (!color) {
|
|
return null;
|
|
}
|
|
|
|
return <AgentStatusDotView color={color} />;
|
|
}
|
|
|
|
function AgentStatusDotView({ color }: { color: string }) {
|
|
const dotStyle = useMemo(() => [styles.dot, { backgroundColor: color }], [color]);
|
|
return <View style={dotStyle} />;
|
|
}
|
|
|
|
function isAgentLifecycleStatus(value: string): value is AgentLifecycleStatus {
|
|
return AGENT_LIFECYCLE_STATUSES.some((status) => status === value);
|
|
}
|
|
|
|
const styles = StyleSheet.create((theme) => ({
|
|
dot: {
|
|
width: 8,
|
|
height: 8,
|
|
borderRadius: theme.borderRadius.full,
|
|
},
|
|
}));
|