Changes from fix/bug-fixes-1rc

This commit is contained in:
gsxdsm
2026-03-01 21:59:02 -08:00
parent 57bcb2802d
commit 34161ccc08
4 changed files with 31 additions and 11 deletions

View File

@@ -179,11 +179,18 @@ export function AgentOutputModal({
enabled: open && !!resolvedProjectPath,
});
// Fetch feature data to access the server-side accumulated summary
// Fetch feature data to access the server-side accumulated summary.
// Also used to show fresh description/status instead of potentially stale props
// (e.g. when opening via deep link from a notification click).
const { data: feature, refetch: refetchFeature } = useFeature(resolvedProjectPath, featureId, {
enabled: open && !!resolvedProjectPath && !isBacklogPlan,
});
// Prefer fresh data from server over potentially stale props passed at open time.
const resolvedDescription = feature?.description ?? featureDescription;
const resolvedStatus = feature?.status ?? featureStatus;
const resolvedBranchName = feature?.branchName ?? branchName;
// Reset streamed content when modal opens or featureId changes
useEffect(() => {
if (open) {
@@ -519,7 +526,7 @@ export function AgentOutputModal({
<DialogHeader className="shrink-0">
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 pr-10">
<DialogTitle className="flex items-center gap-2">
{featureStatus !== 'verified' && featureStatus !== 'waiting_approval' && (
{resolvedStatus !== 'verified' && resolvedStatus !== 'waiting_approval' && (
<Spinner size="md" />
)}
Agent Output
@@ -581,7 +588,7 @@ export function AgentOutputModal({
className="mt-1 max-h-24 overflow-y-auto wrap-break-word"
data-testid="agent-output-description"
>
{featureDescription}
{resolvedDescription}
</DialogDescription>
</DialogHeader>
@@ -601,7 +608,7 @@ export function AgentOutputModal({
{resolvedProjectPath ? (
<GitDiffPanel
projectPath={resolvedProjectPath}
featureId={branchName || featureId}
featureId={resolvedBranchName || featureId}
compact={false}
useWorktrees={useWorktrees}
className="border-0 rounded-lg"

View File

@@ -595,8 +595,8 @@ function RootLayoutContent() {
'[FAST_HYDRATE] Background reconcile: cache updated (store untouched)'
);
// Selectively reconcile event hooks from server.
// Unlike projects/theme, eventHooks aren't rendered on the main view,
// Selectively reconcile event hooks and ntfy endpoints from server.
// Unlike projects/theme, these aren't rendered on the main view,
// so updating them won't cause a visible re-render flash.
const serverHooks = (finalSettings as GlobalSettings).eventHooks ?? [];
const currentHooks = useAppStore.getState().eventHooks;
@@ -609,6 +609,19 @@ function RootLayoutContent() {
);
useAppStore.setState({ eventHooks: serverHooks });
}
// Reconcile ntfy endpoints from server (same rationale as eventHooks)
const serverEndpoints = (finalSettings as GlobalSettings).ntfyEndpoints ?? [];
const currentEndpoints = useAppStore.getState().ntfyEndpoints;
if (
JSON.stringify(serverEndpoints) !== JSON.stringify(currentEndpoints) &&
serverEndpoints.length > 0
) {
logger.info(
`[FAST_HYDRATE] Reconciling ntfyEndpoints from server (server=${serverEndpoints.length}, store=${currentEndpoints.length})`
);
useAppStore.setState({ ntfyEndpoints: serverEndpoints });
}
} catch (e) {
logger.debug('[FAST_HYDRATE] Failed to update cache:', e);
}

View File

@@ -28,7 +28,7 @@ test.describe('Feature Deep Link', () => {
let projectPath: string;
let projectName: string;
test.beforeEach(async ({}, testInfo) => {
test.beforeEach(async (_fixtures, testInfo) => {
projectName = `test-project-${testInfo.workerIndex}-${Date.now()}`;
projectPath = path.join(TEST_TEMP_DIR, projectName);
fs.mkdirSync(projectPath, { recursive: true });