Skip to content

Fix ntfy endpoint saving and bump version#822

Merged
gsxdsm merged 4 commits intoAutoMaker-Org:v1.0.0rcfrom
gsxdsm:fix/bug-fixes-1rc
Mar 2, 2026
Merged

Fix ntfy endpoint saving and bump version#822
gsxdsm merged 4 commits intoAutoMaker-Org:v1.0.0rcfrom
gsxdsm:fix/bug-fixes-1rc

Conversation

@gsxdsm
Copy link
Collaborator

@gsxdsm gsxdsm commented Mar 2, 2026

Minor bug fixes

Summary by CodeRabbit

  • New Features

    • AI-powered "Resolve with AI" option for merge/conflict resolution.
    • Shows source branch for detected conflicts to aid resolution.
  • Improvements

    • Settings now persist to server (planning mode, default feature model, approval policies).
    • Stop control for running/auto-mode tasks exposed to board actions.
    • Cleaner drag-and-drop and worktree state handling; broader cache reconciliation.
    • Recognizes new model tier (gpt-5.3-codex).

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses minor bug fixes and includes a significant version bump. It enhances the Agent Output Modal to display up-to-date feature information by fetching fresh data from the server, preventing stale content when accessed via deep links. Additionally, it improves the application's state management by correctly reconciling ntfy endpoint configurations from the server, ensuring consistency.

Highlights

  • Agent Output Modal Data Freshness: Implemented data freshness improvements in the Agent Output Modal by prioritizing server-fetched feature details (description, status, branch name) over potentially stale props, particularly relevant for deep-linked notifications.
  • Ntfy Endpoint Reconciliation: Ensured proper synchronization of ntfy endpoint configurations by adding reconciliation logic in the root layout, mirroring the existing handling for event hooks to maintain consistent state.
  • Version Bump: Bumped the project's major version from "0.15.0" to "1.0.0" across the main project and its UI/server workspaces.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • apps/ui/src/components/views/board-view/dialogs/agent-output-modal.tsx
    • Introduced 'resolvedDescription', 'resolvedStatus', and 'resolvedBranchName' to prioritize fresh server data for display.
    • Updated the spinner's conditional rendering to use 'resolvedStatus'.
    • Modified the 'GitDiffPanel's 'featureId' prop to utilize 'resolvedBranchName'.
  • apps/ui/src/routes/__root.tsx
    • Added logic to reconcile 'ntfyEndpoints' from the server, ensuring the client-side store is updated with the latest configurations.
    • Updated comments to reflect the inclusion of 'ntfyEndpoints' in the background reconciliation process.
  • apps/ui/tests/features/feature-deep-link.spec.ts
    • Adjusted the 'test.beforeEach' callback signature for improved clarity.
  • package-lock.json
    • Updated the 'automaker' project version from "0.15.0" to "1.0.0".
    • Updated the '@automaker/server' workspace version from "0.15.0" to "1.0.0".
    • Updated the '@automaker/ui' workspace version from "0.15.0" to "1.0.0".
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 2, 2026

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

📥 Commits

Reviewing files that changed from the base of the PR and between c11f390 and 59b100b.

📒 Files selected for processing (11)
  • apps/server/src/routes/worktree/routes/list.ts
  • apps/ui/src/components/views/board-view.tsx
  • apps/ui/src/components/views/board-view/hooks/use-board-actions.ts
  • apps/ui/src/components/views/board-view/hooks/use-board-drag-drop.ts
  • apps/ui/src/components/views/board-view/worktree-panel/components/worktree-actions-dropdown.tsx
  • apps/ui/src/components/views/board-view/worktree-panel/types.ts
  • apps/ui/src/components/views/graph-view-page.tsx
  • apps/ui/src/hooks/queries/use-worktrees.ts
  • apps/ui/src/hooks/use-auto-mode.ts
  • apps/ui/src/routes/__root.tsx
  • apps/ui/tests/features/feature-deep-link.spec.ts
 _______________________________________________________________
< You're one `console.log` away from enlightenment. Keep going. >
 ---------------------------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ

✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.

Tip

CodeRabbit can use TruffleHog to scan for secrets in your code with verification capabilities.

Add a TruffleHog config file (e.g. trufflehog-config.yml, trufflehog.yml) to your project to customize detectors and scanning behavior. The tool runs only when a config file is present.

📝 Walkthrough

Walkthrough

This PR introduces settings persistence for default feature model, planning mode, and approval requirements; adds AI-driven conflict resolution UI wiring across worktree components; enhances board drag-drop with explicit stopFeature capability; modifies settings hydration to restore all worktree selections; and expands premium model tier categorization.

Changes

Cohort / File(s) Summary
Settings Persistence
apps/server/src/routes/app-spec/parse-and-create-features.ts, apps/server/src/routes/app-spec/generate-features-from-spec.ts
Extended parseAndCreateFeatures to accept SettingsService, resolve default planning mode/approval/model from settings, and apply them to newly created features. Signature now includes optional settingsService parameter.
Store API Synchronization
apps/ui/src/store/app-store.ts
Made setDefaultPlanningMode, setDefaultRequirePlanApproval, and setDefaultFeatureModel async with HTTP API calls to persist changes to server; enhanced setDefaultThinkingLevel to optionally sync updated feature model in a single API call when compatible.
Cache Reconciliation
apps/ui/src/routes/__root.tsx
Expanded server-side cache reconciliation to include ntfyEndpoints alongside eventHooks, comparing and updating store entries when differing and non-empty.
Conflict Resolution Feature Wiring
apps/ui/src/components/views/board-view/worktree-panel/components/worktree-actions-dropdown.tsx, apps/ui/src/components/views/board-view/worktree-panel/components/worktree-dropdown.tsx, apps/ui/src/components/views/board-view/worktree-panel/components/worktree-tab.tsx, apps/ui/src/components/views/board-view/worktree-panel/worktree-panel.tsx
Threaded new onCreateConflictResolutionFeature callback prop through worktree panel component hierarchy; added "Resolve with AI" menu item in WorktreeActionsDropdown that triggers with conflict info payload.
Board Drag-Drop Enhancement
apps/ui/src/components/views/board-view.tsx, apps/ui/src/components/views/board-view/hooks/use-board-drag-drop.ts
Added stopFeature callback prop to useBoardDragDrop and useBoardActions; replaced autoMode.stopFeature usage; changed autoModeByWorktree subscription to derived selector for running tasks; added cleanup effect for stale activeFeature references.
Worktree Conflict Detection
apps/server/src/routes/worktree/routes/list.ts
Added optional conflictSourceBranch field to detectConflictState return type; implemented branch resolution for merge/rebase/cherry-pick conflicts using git name-rev with error handling.
Settings Hydration & AgentOutput
apps/ui/src/hooks/use-settings-migration.ts, apps/ui/src/hooks/use-settings-sync.ts, apps/ui/src/components/views/board-view/dialogs/agent-output-modal.tsx
Modified worktree restoration to apply all valid selections and defer stale-entry cleanup to validation effect; updated AgentOutputModal to derive resolved description/status/branch from server-fetched feature data with prop fallbacks.
Model Tier Expansion
apps/server/src/services/codex-model-cache-service.ts
Added "gpt-5.3-codex" to premium model tier categorization logic alongside existing "max" and "gpt-5.2-codex" checks.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

scope: ui, scope: server, feature: settings, feature: conflict-resolution, Ready-To-Merge

Poem

🐰 Bunny hops through settings and conflicts today,
Threading new callbacks in every which way,
Cache sync and drag-drop, now stop and go fast,
With AI to resolve what git tangled past! ✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Title check ⚠️ Warning The PR title mentions 'ntfy endpoint saving' and 'bump version', but the actual changes include conflict resolution features, settings synchronization, worktree handling, and other functional updates. The title does not accurately reflect the substantial scope of changes. Update the title to reflect the main changes, such as 'Add conflict resolution features, improve settings sync, and enhance worktree state handling' or provide a more comprehensive summary of the key updates.
Docstring Coverage ⚠️ Warning Docstring coverage is 30.77% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a fix for displaying fresh data in the agent output modal and adds logic to synchronize ntfy endpoints during fast hydration. The version is also bumped to 1.0.0.

My review focuses on the new synchronization logic. I've identified a potential issue where deleting all ntfy endpoints on the server might not reflect on the client due to a condition in the reconciliation logic. I've provided a suggestion to address this.

Comment on lines +617 to +618
JSON.stringify(serverEndpoints) !== JSON.stringify(currentEndpoints) &&
serverEndpoints.length > 0
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This condition prevents synchronization when all ntfy endpoints are deleted on the server. If a user removes all endpoints, the server will return an empty array, serverEndpoints.length will be 0, and this if block will not execute. This leaves stale endpoints on the client.

Removing this part of the condition will ensure that an empty array from the server correctly clears the client-side state.

                    JSON.stringify(serverEndpoints) !== JSON.stringify(currentEndpoints)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/ui/src/routes/__root.tsx`:
- Around line 613-624: The reconciliation currently skips applying an empty
server ntfyEndpoints due to the additional serverEndpoints.length > 0 guard,
which preserves deleted endpoints; update the logic in the hydrate/reconcile
block that compares (finalSettings as GlobalSettings).ntfyEndpoints to
useAppStore.getState().ntfyEndpoints so that an empty array from the server is
applied as well—i.e., remove the serverEndpoints.length > 0 condition and keep
the JSON.stringify comparison and subsequent useAppStore.setState({
ntfyEndpoints: serverEndpoints }) call (references: finalSettings,
GlobalSettings, ntfyEndpoints, useAppStore, logger).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 57bcb28 and 34161cc.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (3)
  • apps/ui/src/components/views/board-view/dialogs/agent-output-modal.tsx
  • apps/ui/src/routes/__root.tsx
  • apps/ui/tests/features/feature-deep-link.spec.ts

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
apps/server/src/routes/worktree/routes/list.ts (1)

157-234: conflictSourceBranch is computed but not surfaced to clients.

This block performs extra fs/git resolution, but the field is not assigned onto worktree in the response path. Consider wiring it through (or gating this logic until a consumer is in place) to avoid unnecessary polling overhead.

🔧 Suggested wiring
 interface WorktreeInfo {
   path: string;
   branch: string;
   isMain: boolean;
   isCurrent: boolean; // Is this the currently checked out branch in main?
   hasWorktree: boolean; // Always true for items in this list
   hasChanges?: boolean;
   changedFilesCount?: number;
   pr?: WorktreePRInfo; // PR info if a PR has been created for this branch
   /** Whether there are actual unresolved conflict files (conflictFiles.length > 0) */
   hasConflicts?: boolean;
   /** Type of git operation in progress (merge/rebase/cherry-pick), set independently of hasConflicts */
   conflictType?: 'merge' | 'rebase' | 'cherry-pick';
   /** List of files with conflicts */
   conflictFiles?: string[];
+  /** Source branch involved in merge/rebase/cherry-pick, when resolvable */
+  conflictSourceBranch?: string;
 }
@@
             worktree.hasConflicts = conflictState.hasConflicts;
             worktree.conflictFiles = conflictState.conflictFiles;
+            worktree.conflictSourceBranch = conflictState.conflictSourceBranch;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/server/src/routes/worktree/routes/list.ts` around lines 157 - 234, The
code computes conflictSourceBranch but never attaches it to the worktree object
returned to clients; wire it into the returned worktree (or the existing
response object) so callers receive the value. Locate the local variable
conflictSourceBranch in apps/server/src/routes/worktree/routes/list.ts and add
that value to the worktree (or the returned object shape that includes
hasConflicts/conflictType/conflictFiles) before the method returns; if you want
to avoid extra work when unused, gate the filesystem/git resolution behind
checking whether the consumer expects conflictSourceBranch or only populate it
when a flag is present.
apps/ui/src/components/views/board-view/hooks/use-board-drag-drop.ts (1)

22-23: Consider preserving stop result semantics for more accurate user feedback.

At Line 22 and Line 259, stopFeature is treated as Promise<void>, so any non-throwing failure path is indistinguishable from success and still logs “stopped”. If your stop path can resolve to false, this can produce misleading success messaging.

♻️ Suggested contract + handling update
 interface UseBoardDragDropProps {
-  stopFeature: (featureId: string) => Promise<void>;
+  stopFeature: (featureId: string) => Promise<boolean>;
 }

 ...

-              await stopFeature(featureId);
-              logger.info('Stopped running feature via drag to backlog:', featureId);
+              const stopped = await stopFeature(featureId);
+              if (stopped) {
+                logger.info('Stopped running feature via drag to backlog:', featureId);
+              } else {
+                logger.warn('Feature was not running by the time stop was requested:', featureId);
+              }

Also applies to: 259-266

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/ui/src/components/views/board-view/hooks/use-board-drag-drop.ts` around
lines 22 - 23, Change the stopFeature contract to return a Promise<boolean>
instead of Promise<void> so callers can distinguish success vs non-throwing
failure; update the stopFeature declaration in the interface and its
implementation (stopFeature) to resolve true on success and false on graceful
failure, then update all callers (the use-board-drag-drop handler that currently
awaits stopFeature and logs "stopped") to check the returned boolean and only
log success when true and handle/log the false path as a failed stop (e.g., emit
an error message or fallback behavior).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/server/src/routes/worktree/routes/list.ts`:
- Around line 163-164: The TypeScript error comes from calling .trim() on the
Promise result of secureFs.readFile which is typed as string | Buffer; update
each occurrence (calls to secureFs.readFile in list.ts that read git refs like
'MERGE_HEAD') to ensure a string before trimming — for example, await the read
into a variable then coerce to string ((await
secureFs.readFile(path.join(gitDir, 'MERGE_HEAD'), 'utf-8')) as string).trim()
or use (await secureFs.readFile(...)).toString().trim(); apply the same change
to all similar calls (the other secureFs.readFile usages in this file) so
.trim() operates on a string.

In
`@apps/ui/src/components/views/board-view/worktree-panel/components/worktree-actions-dropdown.tsx`:
- Around line 484-487: The payload to onCreateConflictResolutionFeature
incorrectly uses worktree.branch for both sourceBranch and targetBranch, causing
self-merge instructions; change sourceBranch to the actual conflicting branch
(e.g., the conflict/incoming branch value available in scope such as
conflict.sourceBranch or incomingBranch) when calling
onCreateConflictResolutionFeature, keeping targetBranch as worktree.branch and
preserving targetWorktreePath: worktree.path so the AI receives the real source
vs target branches for resolution.

---

Nitpick comments:
In `@apps/server/src/routes/worktree/routes/list.ts`:
- Around line 157-234: The code computes conflictSourceBranch but never attaches
it to the worktree object returned to clients; wire it into the returned
worktree (or the existing response object) so callers receive the value. Locate
the local variable conflictSourceBranch in
apps/server/src/routes/worktree/routes/list.ts and add that value to the
worktree (or the returned object shape that includes
hasConflicts/conflictType/conflictFiles) before the method returns; if you want
to avoid extra work when unused, gate the filesystem/git resolution behind
checking whether the consumer expects conflictSourceBranch or only populate it
when a flag is present.

In `@apps/ui/src/components/views/board-view/hooks/use-board-drag-drop.ts`:
- Around line 22-23: Change the stopFeature contract to return a
Promise<boolean> instead of Promise<void> so callers can distinguish success vs
non-throwing failure; update the stopFeature declaration in the interface and
its implementation (stopFeature) to resolve true on success and false on
graceful failure, then update all callers (the use-board-drag-drop handler that
currently awaits stopFeature and logs "stopped") to check the returned boolean
and only log success when true and handle/log the false path as a failed stop
(e.g., emit an error message or fallback behavior).

ℹ️ Review info

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 33a2e04 and c11f390.

📒 Files selected for processing (7)
  • apps/server/src/routes/worktree/routes/list.ts
  • apps/ui/src/components/views/board-view.tsx
  • apps/ui/src/components/views/board-view/hooks/use-board-drag-drop.ts
  • apps/ui/src/components/views/board-view/worktree-panel/components/worktree-actions-dropdown.tsx
  • apps/ui/src/components/views/board-view/worktree-panel/components/worktree-dropdown.tsx
  • apps/ui/src/components/views/board-view/worktree-panel/components/worktree-tab.tsx
  • apps/ui/src/components/views/board-view/worktree-panel/worktree-panel.tsx

@gsxdsm gsxdsm merged commit 59b100b into AutoMaker-Org:v1.0.0rc Mar 2, 2026
4 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant