From d3bd12c8ed5288987131af8da855761bebb874b9 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 1 Mar 2026 10:32:09 +0800 Subject: [PATCH] fix: PR base branch --- deps/workers/src/logseq/agents/do.cljs | 65 ++++++++++++-------- deps/workers/test/logseq/agents/do_test.cljs | 65 ++++++++++++++++++++ src/main/frontend/handler/agent.cljs | 6 +- 3 files changed, 107 insertions(+), 29 deletions(-) diff --git a/deps/workers/src/logseq/agents/do.cljs b/deps/workers/src/logseq/agents/do.cljs index a80d98da78..fbfe1596f2 100644 --- a/deps/workers/src/logseq/agents/do.cljs +++ b/deps/workers/src/logseq/agents/do.cljs @@ -776,39 +776,52 @@ (defn- (get-in current-session [:task :project :base-branch]) + source-control/sanitize-branch-name) + default-base (source-control/sanitize-branch-name (default-base-branch)) + choose-base-branch (fn [candidates] + (let [valid-candidates (->> candidates + (map source-control/sanitize-branch-name) + (remove nil?) + vec) + non-head-candidate (some (fn [candidate] + (when (not= candidate head-branch) + candidate)) + valid-candidates) + fallback-non-head (some (fn [candidate] + (let [candidate (source-control/sanitize-branch-name candidate)] + (when (and (string? candidate) + (not= candidate head-branch)) + candidate))) + ["main" "master"])] + (or non-head-candidate + fallback-non-head + (first valid-candidates))))] (cond (false? create-pr?) - (http/json-response :sessions/pr - (cond-> {:status "pushed" - :head-branch head-branch - :message "branch pushed"} - (string? base-branch) (assoc :base-branch base-branch) - (some? force?) (assoc :force force?))) + (let [base-branch (choose-base-branch [requested-base-branch + task-base-branch + default-base])] + (http/json-response :sessions/pr + (cond-> {:status "pushed" + :head-branch head-branch + :message "branch pushed"} + (string? base-branch) (assoc :base-branch base-branch) + (some? force?) (assoc :force force?)))) (not (pr-enabled? current-session)) (http/forbidden) :else - (p/let [pr-token (source-control/ (:body body) str string/trim not-empty) "Automated changes from agent session.") title (or (some-> (:title body) str string/trim not-empty) diff --git a/deps/workers/test/logseq/agents/do_test.cljs b/deps/workers/test/logseq/agents/do_test.cljs index 36d14c110c..ed838bbed5 100644 --- a/deps/workers/test/logseq/agents/do_test.cljs +++ b/deps/workers/test/logseq/agents/do_test.cljs @@ -871,6 +871,68 @@ (is false (str "unexpected error: " error)) (done)))))))) +(deftest pr-endpoint-prefers-detected-default-base-branch-for-pr-create-test + (testing "session publish endpoint uses detected default branch when creating PR" + (async done + (let [create-pr-calls (atom []) + env #js {"AGENT_RUNTIME_PROVIDER" "local-dev"} + self (make-self env) + headers {"content-type" "application/json" + "x-user-id" "user-1"}] + (-> (.put (.-storage self) + "session" + (clj->js {:id "sess-pr-default-base" + :status "running" + :task {:project {:repo-url "https://github.com/example/repo" + :base-branch "main"}} + :runtime {:provider "local-dev" + :session-id "sess-pr-default-base"} + :audit {} + :created-at 0 + :updated-at 0})) + (.then (fn [_] + (with-redefs [runtime-provider/nil base-branch)) (assoc :base-branch (blank->nil base-branch)))) (defn- maybe-insert-pr-sibling-blocks! - [block-uuid resp summary] + [block-uuid summary] (when-let [summary (blank->nil summary)] (editor-handler/api-insert-new-block! (str "PR Summary: " summary) {:block-uuid block-uuid - :sibling? true}))) + :sibling? false}))) (defn- publish-status-message [resp] @@ -735,7 +735,7 @@ (when (= "pr-created" status) (maybe-update-task-pr-url! block-uuid (:pr-url resp))) (maybe-update-task-status! block-uuid status)) - (maybe-insert-pr-sibling-blocks! block-uuid resp (:body raw-body)) + (maybe-insert-pr-sibling-blocks! block-uuid (:body raw-body)) (notification/show! (publish-status-message resp) (if (= "manual-pr-required" (:status resp)) :warning