@github/copilot-sdk-win32-x64 1.0.15-preview.2 → 1.0.15-preview.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -72,6 +72,18 @@
72
72
  "stability": "experimental"
73
73
  }
74
74
  },
75
+ "sandbox": {
76
+ "getHostSupport": {
77
+ "rpcMethod": "sandbox.getHostSupport",
78
+ "description": "Reports whether the host running this runtime can run the command sandbox, without starting a session or spawning a sandboxed command.",
79
+ "params": null,
80
+ "result": {
81
+ "$ref": "#/definitions/SandboxHostSupport",
82
+ "description": "Whether the host running this runtime can run the command sandbox. The runtime checks `supported` once per process. A capability answer can change while the process runs, for example after the user installs a missing package."
83
+ },
84
+ "stability": "experimental"
85
+ }
86
+ },
75
87
  "tools": {
76
88
  "list": {
77
89
  "rpcMethod": "tools.list",
@@ -4682,6 +4694,53 @@
4682
4694
  "description": "Instruction sources loaded for the session, in merge order."
4683
4695
  },
4684
4696
  "stability": "experimental"
4697
+ },
4698
+ "reload": {
4699
+ "rpcMethod": "session.instructions.reload",
4700
+ "description": "Invalidates cached custom-instruction discovery so subsequent turns and source reads observe instruction files currently on disk.",
4701
+ "params": {
4702
+ "type": "object",
4703
+ "properties": {
4704
+ "sessionId": {
4705
+ "type": "string",
4706
+ "description": "Target session identifier"
4707
+ }
4708
+ },
4709
+ "required": [
4710
+ "sessionId"
4711
+ ],
4712
+ "additionalProperties": false,
4713
+ "description": "Identifies the target session."
4714
+ },
4715
+ "result": {
4716
+ "type": "null"
4717
+ },
4718
+ "stability": "experimental"
4719
+ }
4720
+ },
4721
+ "customizations": {
4722
+ "reload": {
4723
+ "rpcMethod": "session.customizations.reload",
4724
+ "description": "Reloads all repository and user customizations for the active session: instructions, plugins and their MCP servers and hooks, custom agents, extensions, and skills. Returns diagnostics from the final skill reload.",
4725
+ "params": {
4726
+ "type": "object",
4727
+ "properties": {
4728
+ "sessionId": {
4729
+ "type": "string",
4730
+ "description": "Target session identifier"
4731
+ }
4732
+ },
4733
+ "required": [
4734
+ "sessionId"
4735
+ ],
4736
+ "additionalProperties": false,
4737
+ "description": "Identifies the target session."
4738
+ },
4739
+ "result": {
4740
+ "$ref": "#/definitions/SkillsLoadDiagnostics",
4741
+ "description": "Diagnostics from reloading skill definitions, with warnings and errors as separate lists."
4742
+ },
4743
+ "stability": "experimental"
4685
4744
  }
4686
4745
  },
4687
4746
  "fleet": {
@@ -6600,6 +6659,88 @@
6600
6659
  }
6601
6660
  }
6602
6661
  },
6662
+ "diagnostics": {
6663
+ "configure": {
6664
+ "rpcMethod": "session.diagnostics.configure",
6665
+ "description": "Patches configured session diagnostic sources without restarting their producers. Setting a source level to off clears its retained diagnostics and invalidates cursors selecting that source.",
6666
+ "params": {
6667
+ "type": "object",
6668
+ "properties": {
6669
+ "sessionId": {
6670
+ "type": "string",
6671
+ "description": "Target session identifier"
6672
+ },
6673
+ "sources": {
6674
+ "$ref": "#/definitions/DiagnosticSourcesConfiguration",
6675
+ "description": "Sources to configure. At least one supported source must be supplied."
6676
+ }
6677
+ },
6678
+ "required": [
6679
+ "sessionId",
6680
+ "sources"
6681
+ ],
6682
+ "additionalProperties": false,
6683
+ "description": "Patch session diagnostic thresholds for explicitly supplied sources.",
6684
+ "title": "DiagnosticsConfigureRequest",
6685
+ "stability": "experimental"
6686
+ },
6687
+ "result": {
6688
+ "$ref": "#/definitions/DiagnosticsConfiguration",
6689
+ "description": "Per-source session diagnostics configuration."
6690
+ },
6691
+ "stability": "experimental"
6692
+ },
6693
+ "read": {
6694
+ "rpcMethod": "session.diagnostics.read",
6695
+ "description": "Reads a bounded batch of retained session diagnostics for the selected sources. Records are never consumed and each reader advances independently through its opaque cursor.",
6696
+ "params": {
6697
+ "type": "object",
6698
+ "properties": {
6699
+ "sessionId": {
6700
+ "type": "string",
6701
+ "description": "Target session identifier"
6702
+ },
6703
+ "sources": {
6704
+ "type": "array",
6705
+ "items": {
6706
+ "$ref": "#/definitions/DiagnosticSource",
6707
+ "description": "A supported diagnostic source."
6708
+ },
6709
+ "description": "Nonempty selection of sources to read. Each source may be listed once."
6710
+ },
6711
+ "cursor": {
6712
+ "type": "string",
6713
+ "description": "Opaque cursor returned by an earlier read. Omit to start at the oldest retained record."
6714
+ },
6715
+ "max": {
6716
+ "type": "integer",
6717
+ "exclusiveMinimum": 0,
6718
+ "maximum": 500,
6719
+ "description": "Maximum number of records to return, from 1 through 500. Omit for 100."
6720
+ },
6721
+ "waitMs": {
6722
+ "type": "integer",
6723
+ "minimum": 0,
6724
+ "maximum": 30000,
6725
+ "description": "Maximum time in milliseconds to wait for a new record, from 0 through 30000."
6726
+ }
6727
+ },
6728
+ "required": [
6729
+ "sessionId",
6730
+ "sources"
6731
+ ],
6732
+ "additionalProperties": false,
6733
+ "description": "Cursor-based request for session diagnostics. The default limit is 100 (maximum 500); the default waitMs is zero (maximum 30000).",
6734
+ "title": "DiagnosticsReadRequest",
6735
+ "stability": "experimental"
6736
+ },
6737
+ "result": {
6738
+ "$ref": "#/definitions/DiagnosticsReadResult",
6739
+ "description": "One cursor-addressed page of retained session diagnostics."
6740
+ },
6741
+ "stability": "experimental"
6742
+ }
6743
+ },
6603
6744
  "connectors": {
6604
6745
  "getCapabilities": {
6605
6746
  "rpcMethod": "session.connectors.getCapabilities",
@@ -10720,7 +10861,7 @@
10720
10861
  },
10721
10862
  "withdrawMessage": {
10722
10863
  "rpcMethod": "session.queue.withdrawMessage",
10723
- "description": "Atomically withdraws an unchanged, unconsumed user message from the local queued or steering lane. A client retaining the original draft may restore it only when removed is true. Does not interrupt the running turn.",
10864
+ "description": "Atomically withdraws an unchanged user message of a local session: from the queued or steering lane while unconsumed, or from the running turn it started while the model has not answered it and nothing the user sent after it is pending. Withdrawing from the running turn interrupts that turn and removes its events from history. A client retaining the original draft may restore it only when removed is true.",
10724
10865
  "params": {
10725
10866
  "type": "object",
10726
10867
  "properties": {
@@ -10743,13 +10884,13 @@
10743
10884
  "expectedPrompt"
10744
10885
  ],
10745
10886
  "additionalProperties": false,
10746
- "description": "Conditional withdrawal of a single user message, before the runtime claims it for delivery.",
10887
+ "description": "Conditional withdrawal of a single user message, from its queue or from the running turn it started.",
10747
10888
  "title": "QueueWithdrawMessageRequest",
10748
10889
  "stability": "experimental"
10749
10890
  },
10750
10891
  "result": {
10751
- "$ref": "#/definitions/QueueRemoveAtResult",
10752
- "description": "Result of removing a queued item."
10892
+ "$ref": "#/definitions/QueueWithdrawMessageResult",
10893
+ "description": "Result of withdrawing a user message."
10753
10894
  },
10754
10895
  "stability": "experimental"
10755
10896
  },
@@ -19994,6 +20135,239 @@
19994
20135
  "additional": "Caller-provided diagnostic entry."
19995
20136
  }
19996
20137
  },
20138
+ "DiagnosticCursorStatus": {
20139
+ "type": "string",
20140
+ "enum": [
20141
+ "ok",
20142
+ "expired"
20143
+ ],
20144
+ "description": "Whether the supplied diagnostic cursor remained within the retained buffer window.",
20145
+ "title": "DiagnosticCursorStatus",
20146
+ "x-enumDescriptions": {
20147
+ "ok": "The cursor is valid for the current retained window.",
20148
+ "expired": "The cursor no longer addresses retained records; reading resumes at the oldest retained record."
20149
+ }
20150
+ },
20151
+ "DiagnosticEntry": {
20152
+ "anyOf": [
20153
+ {
20154
+ "type": "object",
20155
+ "properties": {
20156
+ "timestamp": {
20157
+ "type": "string",
20158
+ "description": "UTC RFC 3339 timestamp captured at the diagnostic source."
20159
+ },
20160
+ "level": {
20161
+ "$ref": "#/definitions/DiagnosticSeverity",
20162
+ "description": "Severity of this emitted diagnostic record."
20163
+ },
20164
+ "agentId": {
20165
+ "type": "string",
20166
+ "description": "Agent identifier for a subagent host. Omitted for the root agent."
20167
+ },
20168
+ "message": {
20169
+ "type": "string",
20170
+ "description": "Human-readable diagnostic summary."
20171
+ },
20172
+ "truncated": {
20173
+ "type": "boolean",
20174
+ "description": "Whether message or data was truncated to the record-size bound."
20175
+ },
20176
+ "originalBytes": {
20177
+ "type": "integer",
20178
+ "minimum": 0,
20179
+ "description": "Original byte count when a known-size message or data value was truncated."
20180
+ },
20181
+ "details": {
20182
+ "$ref": "#/definitions/McpDiagnosticDetails",
20183
+ "description": "Typed MCP diagnostic detail."
20184
+ },
20185
+ "source": {
20186
+ "type": "string",
20187
+ "const": "mcp",
20188
+ "description": "Diagnostic source identifying the typed details payload."
20189
+ }
20190
+ },
20191
+ "required": [
20192
+ "source",
20193
+ "timestamp",
20194
+ "level",
20195
+ "message",
20196
+ "details"
20197
+ ],
20198
+ "additionalProperties": false
20199
+ }
20200
+ ],
20201
+ "description": "One retained session-scoped diagnostic record. Potentially content-bearing diagnostic data is opt-in and must not be exported automatically as telemetry.",
20202
+ "title": "DiagnosticEntry"
20203
+ },
20204
+ "DiagnosticLogLevel": {
20205
+ "type": "string",
20206
+ "enum": [
20207
+ "off",
20208
+ "error",
20209
+ "warning",
20210
+ "info",
20211
+ "debug",
20212
+ "trace"
20213
+ ],
20214
+ "description": "Session-scoped diagnostic threshold. Capture is disabled by default and is never persisted with the session.",
20215
+ "title": "DiagnosticLogLevel",
20216
+ "x-enumDescriptions": {
20217
+ "off": "Disable capture and clear retained diagnostics.",
20218
+ "error": "Capture failures only.",
20219
+ "warning": "Capture failures, warnings, and stderr.",
20220
+ "info": "Capture lifecycle diagnostics.",
20221
+ "debug": "Capture protocol frames and launch diagnostics.",
20222
+ "trace": "Capture HTTP metadata in addition to debug diagnostics."
20223
+ }
20224
+ },
20225
+ "DiagnosticsConfiguration": {
20226
+ "type": "object",
20227
+ "properties": {
20228
+ "sources": {
20229
+ "$ref": "#/definitions/DiagnosticSourcesConfiguration",
20230
+ "description": "Diagnostic thresholds keyed by supported source."
20231
+ }
20232
+ },
20233
+ "required": [
20234
+ "sources"
20235
+ ],
20236
+ "additionalProperties": false,
20237
+ "description": "Per-source session diagnostics configuration.",
20238
+ "title": "DiagnosticsConfiguration",
20239
+ "stability": "experimental"
20240
+ },
20241
+ "DiagnosticsConfigureRequest": {
20242
+ "type": "object",
20243
+ "properties": {
20244
+ "sources": {
20245
+ "$ref": "#/definitions/DiagnosticSourcesConfiguration",
20246
+ "description": "Sources to configure. At least one supported source must be supplied."
20247
+ }
20248
+ },
20249
+ "required": [
20250
+ "sources"
20251
+ ],
20252
+ "additionalProperties": false,
20253
+ "description": "Patch session diagnostic thresholds for explicitly supplied sources.",
20254
+ "title": "DiagnosticsConfigureRequest",
20255
+ "stability": "experimental"
20256
+ },
20257
+ "DiagnosticSeverity": {
20258
+ "type": "string",
20259
+ "enum": [
20260
+ "error",
20261
+ "warning",
20262
+ "info",
20263
+ "debug",
20264
+ "trace"
20265
+ ],
20266
+ "description": "Severity of an emitted diagnostic record.",
20267
+ "title": "DiagnosticSeverity",
20268
+ "x-enumDescriptions": {
20269
+ "error": "Failure that prevented or interrupted communication.",
20270
+ "warning": "A recoverable warning or server standard-error output.",
20271
+ "info": "Lifecycle transition.",
20272
+ "debug": "Protocol-frame or launch diagnostic.",
20273
+ "trace": "HTTP metadata diagnostic."
20274
+ }
20275
+ },
20276
+ "DiagnosticSource": {
20277
+ "type": "string",
20278
+ "enum": [
20279
+ "mcp"
20280
+ ],
20281
+ "description": "A supported diagnostic source.",
20282
+ "title": "DiagnosticSource"
20283
+ },
20284
+ "DiagnosticSourcesConfiguration": {
20285
+ "type": "object",
20286
+ "properties": {
20287
+ "mcp": {
20288
+ "$ref": "#/definitions/McpDiagnosticSourceConfiguration",
20289
+ "description": "MCP diagnostic capture threshold. Omit to leave the current threshold unchanged."
20290
+ }
20291
+ },
20292
+ "additionalProperties": false,
20293
+ "description": "Typed diagnostic source configuration. At least one source is required by diagnostics configuration methods.",
20294
+ "title": "DiagnosticSourcesConfiguration"
20295
+ },
20296
+ "DiagnosticsReadRequest": {
20297
+ "type": "object",
20298
+ "properties": {
20299
+ "sources": {
20300
+ "type": "array",
20301
+ "items": {
20302
+ "$ref": "#/definitions/DiagnosticSource",
20303
+ "description": "A supported diagnostic source."
20304
+ },
20305
+ "description": "Nonempty selection of sources to read. Each source may be listed once."
20306
+ },
20307
+ "cursor": {
20308
+ "type": "string",
20309
+ "description": "Opaque cursor returned by an earlier read. Omit to start at the oldest retained record."
20310
+ },
20311
+ "max": {
20312
+ "type": "integer",
20313
+ "exclusiveMinimum": 0,
20314
+ "maximum": 500,
20315
+ "description": "Maximum number of records to return, from 1 through 500. Omit for 100."
20316
+ },
20317
+ "waitMs": {
20318
+ "type": "integer",
20319
+ "minimum": 0,
20320
+ "maximum": 30000,
20321
+ "description": "Maximum time in milliseconds to wait for a new record, from 0 through 30000."
20322
+ }
20323
+ },
20324
+ "required": [
20325
+ "sources"
20326
+ ],
20327
+ "additionalProperties": false,
20328
+ "description": "Cursor-based request for session diagnostics. The default limit is 100 (maximum 500); the default waitMs is zero (maximum 30000).",
20329
+ "title": "DiagnosticsReadRequest",
20330
+ "stability": "experimental"
20331
+ },
20332
+ "DiagnosticsReadResult": {
20333
+ "type": "object",
20334
+ "properties": {
20335
+ "entries": {
20336
+ "type": "array",
20337
+ "items": {
20338
+ "$ref": "#/definitions/DiagnosticEntry",
20339
+ "description": "One retained session-scoped diagnostic record. Potentially content-bearing diagnostic data is opt-in and must not be exported automatically as telemetry."
20340
+ },
20341
+ "description": "Retained records beginning at the requested cursor."
20342
+ },
20343
+ "cursor": {
20344
+ "type": "string",
20345
+ "description": "Opaque cursor for the next independent read."
20346
+ },
20347
+ "cursorStatus": {
20348
+ "$ref": "#/definitions/DiagnosticCursorStatus",
20349
+ "description": "Whether the requested cursor remained within the retained buffer window."
20350
+ },
20351
+ "droppedCount": {
20352
+ "type": "integer",
20353
+ "minimum": 0,
20354
+ "description": "Number of records lost before this page when known. Omitted when a buffer generation change makes the count unknowable."
20355
+ },
20356
+ "hasMore": {
20357
+ "type": "boolean",
20358
+ "description": "Whether additional retained records follow this page."
20359
+ }
20360
+ },
20361
+ "required": [
20362
+ "entries",
20363
+ "cursor",
20364
+ "cursorStatus",
20365
+ "hasMore"
20366
+ ],
20367
+ "additionalProperties": false,
20368
+ "description": "One cursor-addressed page of retained session diagnostics.",
20369
+ "title": "DiagnosticsReadResult"
20370
+ },
19997
20371
  "DiscoveredCanvas": {
19998
20372
  "type": "object",
19999
20373
  "properties": {
@@ -26089,6 +26463,84 @@
26089
26463
  "description": "Result of configuring GitHub MCP.",
26090
26464
  "title": "McpConfigureGitHubResult"
26091
26465
  },
26466
+ "McpDiagnosticDetails": {
26467
+ "type": "object",
26468
+ "properties": {
26469
+ "kind": {
26470
+ "$ref": "#/definitions/McpDiagnosticKind",
26471
+ "description": "Diagnostic record category."
26472
+ },
26473
+ "serverName": {
26474
+ "type": "string",
26475
+ "description": "Configured MCP server name."
26476
+ },
26477
+ "connectionId": {
26478
+ "type": "string",
26479
+ "description": "Fresh identifier for the MCP connection attempt, including failed starts."
26480
+ },
26481
+ "direction": {
26482
+ "$ref": "#/definitions/McpDiagnosticDirection",
26483
+ "description": "Protocol-frame direction when kind is protocol."
26484
+ },
26485
+ "data": {
26486
+ "type": "string",
26487
+ "description": "Serialized diagnostic detail. Protocol and HTTP records use JSON when detail is present."
26488
+ }
26489
+ },
26490
+ "required": [
26491
+ "kind",
26492
+ "serverName",
26493
+ "connectionId"
26494
+ ],
26495
+ "additionalProperties": false,
26496
+ "description": "MCP-specific detail for a source-discriminated diagnostic entry.",
26497
+ "title": "McpDiagnosticDetails"
26498
+ },
26499
+ "McpDiagnosticDirection": {
26500
+ "type": "string",
26501
+ "enum": [
26502
+ "client-to-server",
26503
+ "server-to-client"
26504
+ ],
26505
+ "description": "Direction of an observed MCP protocol frame.",
26506
+ "title": "McpDiagnosticDirection",
26507
+ "x-enumDescriptions": {
26508
+ "client-to-server": "Frame emitted by the Copilot MCP client.",
26509
+ "server-to-client": "Frame received from the MCP server."
26510
+ }
26511
+ },
26512
+ "McpDiagnosticKind": {
26513
+ "type": "string",
26514
+ "enum": [
26515
+ "lifecycle",
26516
+ "protocol",
26517
+ "http",
26518
+ "stderr"
26519
+ ],
26520
+ "description": "Category for an MCP diagnostic record.",
26521
+ "title": "McpDiagnosticKind",
26522
+ "x-enumDescriptions": {
26523
+ "lifecycle": "Connection lifecycle transition or failure.",
26524
+ "protocol": "JSON-RPC protocol frame.",
26525
+ "http": "HTTP request or response metadata.",
26526
+ "stderr": "Local MCP server standard-error output."
26527
+ }
26528
+ },
26529
+ "McpDiagnosticSourceConfiguration": {
26530
+ "type": "object",
26531
+ "properties": {
26532
+ "level": {
26533
+ "$ref": "#/definitions/DiagnosticLogLevel",
26534
+ "description": "Threshold to apply to MCP diagnostic producers in this session."
26535
+ }
26536
+ },
26537
+ "required": [
26538
+ "level"
26539
+ ],
26540
+ "additionalProperties": false,
26541
+ "description": "MCP diagnostic source configuration.",
26542
+ "title": "McpDiagnosticSourceConfiguration"
26543
+ },
26092
26544
  "McpDisableRequest": {
26093
26545
  "type": "object",
26094
26546
  "properties": {
@@ -28654,6 +29106,13 @@
28654
29106
  "type": "string",
28655
29107
  "description": "OAuth client ID for a pre-registered remote MCP OAuth client."
28656
29108
  },
29109
+ "oauthScopes": {
29110
+ "type": "array",
29111
+ "items": {
29112
+ "type": "string"
29113
+ },
29114
+ "description": "Non-empty array of valid RFC 6749 scope-token strings to request for the statically configured OAuth client when the server challenge omits scope or provides an empty scope. Requires a non-empty oauthClientId. These scopes take precedence over protected-resource metadata."
29115
+ },
28657
29116
  "oauthPublicClient": {
28658
29117
  "type": "boolean",
28659
29118
  "description": "Whether the configured OAuth client is public and does not require a client secret."
@@ -36253,6 +36712,10 @@
36253
36712
  "agentMode": {
36254
36713
  "$ref": "#/definitions/SendAgentMode",
36255
36714
  "description": "Agent mode stored on this queued entry, as stamped when it was enqueued. Items without an explicit mode report interactive. This is not necessarily the mode that will constrain the turn: a plan or autopilot session applies its own write gate, continuation loop and permission posture to every drained item regardless of the mode stored here."
36715
+ },
36716
+ "source": {
36717
+ "type": "string",
36718
+ "description": "Optional source tag associated with this pending queue entry. This is an open string, not authenticated authorship. In particular, `user` does not prove that a person typed the message. If the source is absent or unrecognized, consumers must not infer human or agent authorship and should handle the entry neutrally. Consumers should tolerate future source values."
36256
36719
  }
36257
36720
  },
36258
36721
  "required": [
@@ -36300,6 +36763,10 @@
36300
36763
  "type": "integer",
36301
36764
  "minimum": 0,
36302
36765
  "description": "How many leading entries of `steeringMessages` have already been folded into the running turn (and so have an emitted `user.message`), as opposed to still waiting for one. Absent for hosts that do not distinguish the two."
36766
+ },
36767
+ "withdrawableTurnMessageId": {
36768
+ "type": "string",
36769
+ "description": "ID of the running turn's user message while the model has not answered it, so `withdrawMessage` can still take it back once nothing sent after it is pending. A message leaves `items` when its turn starts, before its `user.message` is recorded; this tells that message apart from one that was removed. Absent when no turn prompt can be taken back."
36303
36770
  }
36304
36771
  },
36305
36772
  "required": [
@@ -36505,10 +36972,31 @@
36505
36972
  "expectedPrompt"
36506
36973
  ],
36507
36974
  "additionalProperties": false,
36508
- "description": "Conditional withdrawal of a single user message, before the runtime claims it for delivery.",
36975
+ "description": "Conditional withdrawal of a single user message, from its queue or from the running turn it started.",
36509
36976
  "title": "QueueWithdrawMessageRequest",
36510
36977
  "stability": "experimental"
36511
36978
  },
36979
+ "QueueWithdrawMessageResult": {
36980
+ "type": "object",
36981
+ "properties": {
36982
+ "removed": {
36983
+ "type": "boolean",
36984
+ "description": "True when the message left the queue or, for a running turn, history."
36985
+ },
36986
+ "interrupted": {
36987
+ "type": "boolean",
36988
+ "description": "True when the running turn was interrupted to withdraw the message. With removed false, the turn was interrupted but its events could not be removed, for example because the model answered first, so the message stays in the interrupted turn."
36989
+ }
36990
+ },
36991
+ "required": [
36992
+ "removed",
36993
+ "interrupted"
36994
+ ],
36995
+ "additionalProperties": false,
36996
+ "description": "Result of withdrawing a user message.",
36997
+ "title": "QueueWithdrawMessageResult",
36998
+ "stability": "experimental"
36999
+ },
36512
37000
  "ReasoningSummary": {
36513
37001
  "type": "string",
36514
37002
  "enum": [
@@ -37440,6 +37928,66 @@
37440
37928
  "description": "Managed sandbox enforcement state for a session.",
37441
37929
  "title": "SandboxEnforcementStatus"
37442
37930
  },
37931
+ "SandboxHostCapability": {
37932
+ "type": "object",
37933
+ "properties": {
37934
+ "name": {
37935
+ "$ref": "#/definitions/SandboxHostCapabilityName",
37936
+ "description": "The policy feature, as an extensible string: ignore names you do not recognize. Known values: `network` (sandboxed commands can reach the network; on Linux this needs the tooling for Bubblewrap's private network namespace, such as slirp4netns), `network_filtering` (host rules and the sandbox proxy; on Linux this needs the same tooling as `network`; on Windows it needs Process Security Environment 1.1 host-loopback support, and a policy that uses it must also set `network.allowLocalNetwork`), `denied_paths` (native enforcement of `filesystem.deniedPaths`), and `shell` (shell commands inside the sandbox; on Windows this needs Process Security Environment 1.1 filesystem enumeration support)."
37937
+ },
37938
+ "supported": {
37939
+ "type": "boolean",
37940
+ "description": "Whether this host can run the feature."
37941
+ },
37942
+ "reason": {
37943
+ "type": "string",
37944
+ "description": "Human-readable reason and remedy when the feature is unsupported, such as a package to install or an OS update. Present only when `supported` is false."
37945
+ }
37946
+ },
37947
+ "required": [
37948
+ "name",
37949
+ "supported"
37950
+ ],
37951
+ "additionalProperties": false,
37952
+ "description": "Whether this host can run one sandbox policy feature. A session whose effective policy uses an unsupported feature fails each sandboxed command with `reason`.",
37953
+ "title": "SandboxHostCapability"
37954
+ },
37955
+ "SandboxHostCapabilityName": {
37956
+ "type": "string",
37957
+ "minLength": 1,
37958
+ "maxLength": 64,
37959
+ "pattern": "^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$",
37960
+ "description": "Extensible identifier of a sandbox policy feature whose availability varies between hosts. A plain string, so an older client decodes a name added by a newer runtime; ignore names you do not recognize. Known values: `network` — sandboxed commands can reach the network (`network.allowOutbound`, on by default); on Linux this needs the tooling for Bubblewrap's private network namespace, such as slirp4netns. `network_filtering` — host rules and the sandbox proxy (`network.allowedHosts`, `network.blockedHosts`, `network.proxy`); on Linux this needs the same tooling as `network`; on Windows it needs a version with Process Security Environment 1.1 host-loopback support, and a policy that uses it must also set `network.allowLocalNetwork`, because Windows reaches the local proxy only together with private-network access. `denied_paths` — native enforcement of `filesystem.deniedPaths`; on Windows this needs a version whose sandbox contract reports denied-path support. `shell` — shell commands inside the sandbox: bash on macOS and Linux, PowerShell on Windows; on Windows this needs a version with Process Security Environment 1.1 filesystem enumeration support.",
37961
+ "title": "SandboxHostCapabilityName"
37962
+ },
37963
+ "SandboxHostSupport": {
37964
+ "type": "object",
37965
+ "properties": {
37966
+ "supported": {
37967
+ "type": "boolean",
37968
+ "description": "Whether a process-containment backend is usable on this host: Seatbelt on macOS, Bubblewrap on Linux, or ProcessContainer on Windows."
37969
+ },
37970
+ "reason": {
37971
+ "type": "string",
37972
+ "description": "Human-readable reason the sandbox cannot run on this host. Present only when `supported` is false."
37973
+ },
37974
+ "capabilities": {
37975
+ "type": "array",
37976
+ "items": {
37977
+ "$ref": "#/definitions/SandboxHostCapability",
37978
+ "description": "Whether this host can run one sandbox policy feature. A session whose effective policy uses an unsupported feature fails each sandboxed command with `reason`."
37979
+ },
37980
+ "description": "Sandbox policy features whose availability varies between hosts that can run the backend. Empty when `supported` is false, because no feature can run without a backend. Later runtimes can add entries; ignore an entry whose `name` you do not recognize."
37981
+ }
37982
+ },
37983
+ "required": [
37984
+ "supported",
37985
+ "capabilities"
37986
+ ],
37987
+ "additionalProperties": false,
37988
+ "description": "Whether the host running this runtime can run the command sandbox. The runtime checks `supported` once per process. A capability answer can change while the process runs, for example after the user installs a missing package.",
37989
+ "title": "SandboxHostSupport"
37990
+ },
37443
37991
  "SandboxSessionChange": {
37444
37992
  "type": "string",
37445
37993
  "enum": [