Skip to content

Commit 498fff8

Browse files
committed
Return PermissionRequestResult in Python permission samples
Python permission request handlers return PermissionRequestResult objects, not raw dictionaries. Update the docs and scenario samples that were still using dict-shaped examples so readers and scenario runs get the intended approve-once behavior instead of falling back to user-not-available. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 9f0821a commit 498fff8

7 files changed

Lines changed: 23 additions & 11 deletions

File tree

docs/features/hooks.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,13 @@ const session = await client.createSession({
6161

6262
```python
6363
from copilot import CopilotClient
64+
from copilot.session import PermissionRequestResult
6465

6566
client = CopilotClient()
6667
await client.start()
6768

6869
session = await client.create_session(
69-
on_permission_request=lambda req, inv: {"kind": "approve-once"},
70+
on_permission_request=lambda req, inv: PermissionRequestResult(kind="approve-once"),
7071
hooks={
7172
"on_session_start": on_session_start,
7273
"on_pre_tool_use": on_pre_tool_use,
@@ -261,6 +262,8 @@ const session = await client.createSession({
261262
<summary><strong>Python</strong></summary>
262263

263264
```python
265+
from copilot.session import PermissionRequestResult
266+
264267
READ_ONLY_TOOLS = ["read_file", "glob", "grep", "view"]
265268

266269
async def on_pre_tool_use(input_data, invocation):
@@ -273,7 +276,7 @@ async def on_pre_tool_use(input_data, invocation):
273276
return {"permissionDecision": "allow"}
274277

275278
session = await client.create_session(
276-
on_permission_request=lambda req, inv: {"kind": "approve-once"},
279+
on_permission_request=lambda req, inv: PermissionRequestResult(kind="approve-once"),
277280
hooks={"on_pre_tool_use": on_pre_tool_use},
278281
)
279282
```
@@ -575,6 +578,7 @@ const session = await client.createSession({
575578
<!-- docs-validate: skip -->
576579
```python
577580
import json, aiofiles
581+
from copilot.session import PermissionRequestResult
578582

579583
audit_log = []
580584

@@ -626,7 +630,7 @@ async def on_session_end(input_data, invocation):
626630
return None
627631

628632
session = await client.create_session(
629-
on_permission_request=lambda req, inv: {"kind": "approve-once"},
633+
on_permission_request=lambda req, inv: PermissionRequestResult(kind="approve-once"),
630634
hooks={
631635
"on_session_start": on_session_start,
632636
"on_user_prompt_submitted": on_user_prompt_submitted,
@@ -705,6 +709,7 @@ const session = await client.createSession({
705709

706710
```python
707711
import subprocess
712+
from copilot.session import PermissionRequestResult
708713

709714
async def on_session_end(input_data, invocation):
710715
sid = invocation["session_id"][:8]
@@ -723,7 +728,7 @@ async def on_error_occurred(input_data, invocation):
723728
return None
724729

725730
session = await client.create_session(
726-
on_permission_request=lambda req, inv: {"kind": "approve-once"},
731+
on_permission_request=lambda req, inv: PermissionRequestResult(kind="approve-once"),
727732
hooks={
728733
"on_session_end": on_session_end,
729734
"on_error_occurred": on_error_occurred,
@@ -927,6 +932,8 @@ const session = await client.createSession({
927932
<summary><strong>Python</strong></summary>
928933

929934
```python
935+
from copilot.session import PermissionRequestResult
936+
930937
session_metrics = {}
931938

932939
async def on_session_start(input_data, invocation):
@@ -956,7 +963,7 @@ async def on_session_end(input_data, invocation):
956963
return None
957964

958965
session = await client.create_session(
959-
on_permission_request=lambda req, inv: {"kind": "approve-once"},
966+
on_permission_request=lambda req, inv: PermissionRequestResult(kind="approve-once"),
960967
hooks={
961968
"on_session_start": on_session_start,
962969
"on_user_prompt_submitted": on_user_prompt_submitted,

docs/features/skills.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ async def main():
5050
await client.start()
5151

5252
session = await client.create_session(
53-
on_permission_request=lambda req, inv: {"kind": "approve-once"},
53+
on_permission_request=lambda req, inv: PermissionRequestResult(kind="approve-once"),
5454
model="gpt-4.1",
5555
skill_directories=[
5656
"./skills/code-review",

test/scenarios/callbacks/hooks/python/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
import os
33
from copilot import CopilotClient
44
from copilot.client import SubprocessConfig
5+
from copilot.session import PermissionRequestResult
56

67

78
hook_log: list[str] = []
89

910

1011
async def auto_approve_permission(request, invocation):
11-
return {"kind": "approve-once"}
12+
return PermissionRequestResult(kind="approve-once")
1213

1314

1415
async def on_session_start(input_data, invocation):

test/scenarios/callbacks/permissions/python/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
import os
33
from copilot import CopilotClient
44
from copilot.client import SubprocessConfig
5+
from copilot.session import PermissionRequestResult
56

67
# Track which tools requested permission
78
permission_log: list[str] = []
89

910

1011
async def log_permission(request, invocation):
1112
permission_log.append(f"approved:{request.tool_name}")
12-
return {"kind": "approve-once"}
13+
return PermissionRequestResult(kind="approve-once")
1314

1415

1516
async def auto_approve_tool(input_data, invocation):

test/scenarios/callbacks/user-input/python/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
import os
33
from copilot import CopilotClient
44
from copilot.client import SubprocessConfig
5+
from copilot.session import PermissionRequestResult
56

67

78
input_log: list[str] = []
89

910

1011
async def auto_approve_permission(request, invocation):
11-
return {"kind": "approve-once"}
12+
return PermissionRequestResult(kind="approve-once")
1213

1314

1415
async def auto_approve_tool(input_data, invocation):

test/scenarios/tools/skills/python/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from copilot import CopilotClient
66
from copilot.client import SubprocessConfig
7+
from copilot.session import PermissionRequestResult
78

89

910
async def main():
@@ -16,7 +17,7 @@ async def main():
1617
skills_dir = str(Path(__file__).resolve().parent.parent / "sample-skills")
1718

1819
session = await client.create_session(
19-
on_permission_request=lambda _, __: {"kind": "approve-once"},
20+
on_permission_request=lambda _, __: PermissionRequestResult(kind="approve-once"),
2021
model="claude-haiku-4.5",
2122
skill_directories=[skills_dir],
2223
hooks={

test/scenarios/tools/virtual-filesystem/python/main.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import os
33
from copilot import CopilotClient, define_tool
44
from copilot.client import SubprocessConfig
5+
from copilot.session import PermissionRequestResult
56
from pydantic import BaseModel, Field
67

78
# In-memory virtual filesystem
@@ -39,7 +40,7 @@ def list_files() -> str:
3940

4041

4142
async def auto_approve_permission(request, invocation):
42-
return {"kind": "approve-once"}
43+
return PermissionRequestResult(kind="approve-once")
4344

4445

4546
async def auto_approve_tool(input_data, invocation):

0 commit comments

Comments
 (0)