Skip to content

Commit eb0e718

Browse files
authored
Merge pull request #21 from copilot-community-sdk/feat/client-name-upstream-510
feat: add :client-name to session config (upstream PR #510)
2 parents bb8f466 + 83d4efe commit eb0e718

File tree

6 files changed

+45
-4
lines changed

6 files changed

+45
-4
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@
3232
prompt.md
3333
*.asc
3434
plan.md
35+
update.sh
36+

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ All notable changes to this project will be documented in this file. This change
33

44
## [Unreleased]
55

6+
### Added (upstream PR #510 sync)
7+
- `:client-name` option for `create-session` and `resume-session` — identifies the application using the SDK, included in the User-Agent header for API requests. Forwarded as `clientName` on the wire (upstream PR #510).
8+
69
### Changed (upstream PR #509 sync)
710
- **BREAKING**: Deny all permissions by default — `requestPermission` is now always `true` on the wire, and permission requests are denied when no `:on-permission-request` handler is configured. Previously, omitting the handler meant the CLI never asked for permission. To restore the old behavior, pass `:on-permission-request copilot/approve-all` in your session config.
811

doc/reference/API.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ Create a client and session together, ensuring both are cleaned up on exit.
214214
| Key | Type | Description |
215215
|-----|------|-------------|
216216
| `:session-id` | string | Custom session ID (optional) |
217+
| `:client-name` | string | Client name to identify the application (included in User-Agent header) |
217218
| `:model` | string | Model to use (`"gpt-5.2"`, `"claude-sonnet-4.5"`, etc.) |
218219
| `:tools` | vector | Custom tools exposed to the CLI |
219220
| `:system-message` | map | System message customization (see below) |

src/github/copilot_sdk/client.clj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,7 @@
951951
(util/clj->wire is))]
952952
(cond-> {}
953953
(:session-id config) (assoc :session-id (:session-id config))
954+
(:client-name config) (assoc :client-name (:client-name config))
954955
(:model config) (assoc :model (:model config))
955956
wire-tools (assoc :tools wire-tools)
956957
wire-sys-msg (assoc :system-message wire-sys-msg)
@@ -998,6 +999,7 @@
998999
wire-infinite-sessions (when-let [is (:infinite-sessions config)]
9991000
(util/clj->wire is))]
10001001
(cond-> {:session-id session-id}
1002+
(:client-name config) (assoc :client-name (:client-name config))
10011003
(:model config) (assoc :model (:model config))
10021004
wire-tools (assoc :tools wire-tools)
10031005
wire-sys-msg (assoc :system-message wire-sys-msg)
@@ -1037,6 +1039,7 @@
10371039
10381040
Config options:
10391041
- :session-id - Custom session ID
1042+
- :client-name - Client name to identify the application (included in User-Agent header)
10401043
- :model - Model to use (e.g., \"gpt-5.2\")
10411044
- :tools - Vector of tool definitions
10421045
- :system-message - System message config
@@ -1081,6 +1084,7 @@
10811084
"Resume an existing session by ID.
10821085
10831086
Config options (parity with create-session, upstream PR #376):
1087+
- :client-name - Client name to identify the application (included in User-Agent header)
10841088
- :model - Change the model for the resumed session
10851089
- :tools - Tools exposed to the CLI server
10861090
- :system-message - System message configuration {:mode :content}

src/github/copilot_sdk/specs.clj

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,10 @@
195195
;; Disable resume flag
196196
(s/def ::disable-resume? boolean?)
197197

198+
(s/def ::client-name ::non-blank-string)
199+
198200
(def session-config-keys
199-
#{:session-id :model :tools :system-message
201+
#{:session-id :client-name :model :tools :system-message
200202
:available-tools :excluded-tools :provider
201203
:on-permission-request :streaming? :mcp-servers
202204
:custom-agents :config-dir :skill-directories
@@ -206,7 +208,7 @@
206208

207209
(s/def ::session-config
208210
(closed-keys
209-
(s/keys :opt-un [::session-id ::model ::tools ::system-message
211+
(s/keys :opt-un [::session-id ::client-name ::model ::tools ::system-message
210212
::available-tools ::excluded-tools ::provider
211213
::on-permission-request ::streaming? ::mcp-servers
212214
::custom-agents ::config-dir ::skill-directories
@@ -216,15 +218,15 @@
216218
session-config-keys))
217219

218220
(def ^:private resume-session-config-keys
219-
#{:model :tools :system-message :available-tools :excluded-tools
221+
#{:client-name :model :tools :system-message :available-tools :excluded-tools
220222
:provider :streaming? :on-permission-request
221223
:mcp-servers :custom-agents :config-dir :skill-directories
222224
:disabled-skills :infinite-sessions :reasoning-effort
223225
:on-user-input-request :hooks :working-directory :disable-resume?})
224226

225227
(s/def ::resume-session-config
226228
(closed-keys
227-
(s/keys :opt-un [::model ::tools ::system-message ::available-tools ::excluded-tools
229+
(s/keys :opt-un [::client-name ::model ::tools ::system-message ::available-tools ::excluded-tools
228230
::provider ::streaming? ::on-permission-request
229231
::mcp-servers ::custom-agents ::config-dir ::skill-directories
230232
::disabled-skills ::infinite-sessions ::reasoning-effort

test/github/copilot_sdk/integration_test.clj

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,35 @@
626626
(is (= "direct" (:envValueMode create-params)))
627627
(is (= "direct" (:envValueMode resume-params))))))
628628

629+
(deftest test-client-name-forwarded-on-wire
630+
(testing "clientName is forwarded in session.create when set (upstream PR #510)"
631+
(let [seen (atom {})
632+
_ (mock/set-request-hook! *mock-server* (fn [method params]
633+
(when (#{"session.create"} method)
634+
(swap! seen assoc method params))))
635+
_ (sdk/create-session *test-client* {:client-name "my-app"})
636+
create-params (get @seen "session.create")]
637+
(is (= "my-app" (:clientName create-params)))))
638+
639+
(testing "clientName is forwarded in session.resume when set (upstream PR #510)"
640+
(let [seen (atom {})
641+
session-id (sdk/session-id (sdk/create-session *test-client* {}))
642+
_ (mock/set-request-hook! *mock-server* (fn [method params]
643+
(when (#{"session.resume"} method)
644+
(swap! seen assoc method params))))
645+
_ (sdk/resume-session *test-client* session-id {:client-name "my-app"})
646+
resume-params (get @seen "session.resume")]
647+
(is (= "my-app" (:clientName resume-params)))))
648+
649+
(testing "clientName is omitted from wire when not set"
650+
(let [seen (atom {})
651+
_ (mock/set-request-hook! *mock-server* (fn [method params]
652+
(when (#{"session.create"} method)
653+
(swap! seen assoc method params))))
654+
_ (sdk/create-session *test-client* {:model "gpt-5.2"})
655+
create-params (get @seen "session.create")]
656+
(is (not (contains? create-params :clientName))))))
657+
629658
;; -----------------------------------------------------------------------------
630659
;; Permission Tests (upstream PR #509: deny-by-default)
631660
;; -----------------------------------------------------------------------------

0 commit comments

Comments
 (0)