From 23e83ec8b332b55567f3a7bce8c25eb68e8ed99e Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 27 Feb 2026 14:36:21 +0800 Subject: [PATCH] allow custom git branch --- deps/workers/src/logseq/agents/do.cljs | 76 ++++++-- .../src/logseq/agents/source_control.cljs | 37 ++-- .../workers/src/logseq/sync/malli_schema.cljs | 3 +- src/main/frontend/components/agent_chat.cljs | 36 ++++ src/main/frontend/components/block.cljs | 5 +- src/main/frontend/handler/agent.cljs | 176 +++++++++--------- 6 files changed, 207 insertions(+), 126 deletions(-) diff --git a/deps/workers/src/logseq/agents/do.cljs b/deps/workers/src/logseq/agents/do.cljs index dcd721ece5..1c1d9a83af 100644 --- a/deps/workers/src/logseq/agents/do.cljs +++ b/deps/workers/src/logseq/agents/do.cljs @@ -259,6 +259,44 @@ (or (some-> (aget env "GITHUB_DEFAULT_BASE_BRANCH") str string/trim not-empty) "main")) +(defn- github-default-branch-token + [^js env] + (or (source-control/push-token env) + (source-control/pr-token env))) + +(defn- task-requested-base-branch + [task] + (or (some-> (get-in task [:project :base-branch]) source-control/sanitize-branch-name) + (some-> (get-in task [:project :branch]) source-control/sanitize-branch-name))) + +(defn- (get-in task [:project :repo-url]) str string/trim not-empty) + requested-base (task-requested-base-branch task)] + (cond + (not (map? task)) + (p/resolved task) + + (not (map? (:project task))) + (p/resolved task) + + (string? requested-base) + (p/resolved (assoc-in task [:project :base-branch] requested-base)) + + (not (string? repo-url)) + (p/resolved task) + + :else + (p/let [detected-base (source-control/ error ex-data :reason)] @@ -516,23 +554,24 @@ (http/forbidden) :else - (let [session (session/initial-session task audit now) - [session events _event] (session/append-event session [] {:type "session.created" - :data {:requested-by user-id - :project (:project task) - :agent (:agent task)} - :ts now})] - (p/let [_ ( (:default_branch payload) non-empty-str) - nil)))) - (p/resolved nil)))) + (if-let [{:keys [provider owner name]} (repo-ref repo-url)] + (if-not (= "github" provider) + (p/resolved nil) + (let [url (str (api-base-url env) "/repos/" owner "/" name) + headers (doto (js/Headers.) + (.set "accept" "application/vnd.github+json") + (.set "user-agent" (user-agent env)) + (.set "x-github-api-version" "2022-11-28")) + _ (when (string? token) + (.set headers "authorization" (str "Bearer " token)))] + (p/let [resp (js/fetch url #js {:method "GET" :headers headers}) + status (.-status resp) + text (.text resp) + payload (parse-json-safe text)] + (if (<= 200 status 299) + (some-> (:default_branch payload) non-empty-str) + nil)))) + (p/resolved nil))) (defn (.sendMessage chat #js {:text trimmed-draft}) (.catch (fn [_] nil))))) + start-session! (fn [] + (when (and base session-id (not start-session-disabled?)) + (set-starting-session?! true) + (let [opts (cond-> {} + (string? selected-start-branch) + (assoc :base-branch selected-start-branch))] + (-> (agent-handler/ (agent-handler/nil (pu/get-block-property-value project-page :logseq.property/git-repo)) - project-id (some-> (:block/uuid project-page) str) - title (blank->nil (:block/title project-page))] - (when (and project-id title repo-url) - {:id project-id - :title title - :repo-url repo-url}))) + ([project-page] + (project-config project-page nil)) + ([project-page {:keys [base-branch]}] + (let [repo-url (blank->nil (pu/get-block-property-value project-page :logseq.property/git-repo)) + project-id (some-> (:block/uuid project-page) str) + title (blank->nil (:block/title project-page)) + base-branch (blank->nil base-branch)] + (when (and project-id title repo-url) + (cond-> {:id project-id + :title title + :repo-url repo-url} + (string? base-branch) (assoc :base-branch base-branch)))))) (defn- task-context - [block] - (let [block-uuid (:block/uuid block) - node-id (some-> block-uuid str) - node-title (or (blank->nil (:block/raw-title block)) - (blank->nil (:block/title block)) - "") - content (or (blank->nil (:block/raw-title block)) - (blank->nil (:block/title block)) - "") - project-page (:logseq.property/project block) - agent-page (:logseq.property/agent block) - project (when project-page (project-config project-page)) - agent (when agent-page (agent-config agent-page))] - {:block-uuid block-uuid - :node-id node-id - :node-title node-title - :content content - :attachments [] - :project project - :agent agent})) + ([block] + (task-context block nil)) + ([block opts] + (let [block-uuid (:block/uuid block) + node-id (some-> block-uuid str) + node-title (or (blank->nil (:block/raw-title block)) + (blank->nil (:block/title block)) + "") + content (or (blank->nil (:block/raw-title block)) + (blank->nil (:block/title block)) + "") + project-page (:logseq.property/project block) + agent-page (:logseq.property/agent block) + project (when project-page (project-config project-page opts)) + agent (when agent-page (agent-config agent-page))] + {:block-uuid block-uuid + :node-id node-id + :node-title node-title + :content content + :attachments [] + :project project + :agent agent}))) (defn task-ready? [block] @@ -87,19 +93,21 @@ (> (count (:block/title block)) 4)))) (defn build-session-body - [block] - (let [{:keys [block-uuid node-id node-title content attachments project agent]} (task-context block) - session-id (some-> block-uuid str)] - (when (and session-id node-id (string? node-title) (string? content) (map? project) (map? agent)) - {:session-id session-id - :node-id node-id - :node-title node-title - :content content - :attachments attachments - :project project - :agent agent - :capabilities {:push-enabled true - :pr-enabled true}}))) + ([block] + (build-session-body block nil)) + ([block opts] + (let [{:keys [block-uuid node-id node-title content attachments project agent]} (task-context block opts) + session-id (some-> block-uuid str)] + (when (and session-id node-id (string? node-title) (string? content) (map? project) (map? agent)) + {:session-id session-id + :node-id node-id + :node-title node-title + :content content + :attachments attachments + :project project + :agent agent + :capabilities {:push-enabled true + :pr-enabled true}})))) (def ^:private stream-reconnect-delay-ms 1500) @@ -414,52 +422,54 @@ nil)))))))) (defn js body))} - {:response-schema :sessions/create}) - session-id (:session-id resp) - status (:status resp) - stream-url (:stream-url resp) - block-uuid (:block/uuid block) - _ (when-let [raw-message (message-body (:content raw-body))] - (let [coerced (coerce-http-request :sessions/message raw-message) - msg-body (if (map? coerced) coerced raw-message)] - (db-sync/fetch-json (str base "/sessions/" session-id "/messages") + :else + (p/let [_ (js/Promise. user-handler/task--ensure-id&access-token) + raw-body (build-session-body block opts) + body (coerce-http-request :sessions/create raw-body)] + (if (nil? body) + (do + (notification/show! "Invalid agent session payload." :error false) + nil) + (p/let [resp (db-sync/fetch-json (str base "/sessions") {:method "POST" :headers {"content-type" "application/json"} - :body (js/JSON.stringify (clj->js msg-body))} - {:response-schema :sessions/message})))] - (update-session-state! block-uuid {:session-id session-id - :status status - :runtime-provider (:runtime-provider resp) - :terminal-enabled (true? (:terminal-enabled resp)) - :stream-url stream-url - :started-at (util/time-ms)}) - (js body))} + {:response-schema :sessions/create}) + session-id (:session-id resp) + status (:status resp) + stream-url (:stream-url resp) + block-uuid (:block/uuid block) + _ (when-let [raw-message (message-body (:content raw-body))] + (let [coerced (coerce-http-request :sessions/message raw-message) + msg-body (if (map? coerced) coerced raw-message)] + (db-sync/fetch-json (str base "/sessions/" session-id "/messages") + {:method "POST" + :headers {"content-type" "application/json"} + :body (js/JSON.stringify (clj->js msg-body))} + {:response-schema :sessions/message})))] + (update-session-state! block-uuid {:session-id session-id + :status status + :runtime-provider (:runtime-provider resp) + :terminal-enabled (true? (:terminal-enabled resp)) + :stream-url stream-url + :started-at (util/time-ms)}) + (