Plan or apply a provider-owned fix for a recorded permission denial
curl --request POST \
--url http://localhost:3000/api/v1/permissions/resolve \
--header 'Content-Type: application/json' \
--data '
{
"denialId": "<string>",
"apply": true,
"capabilities": "<string>",
"chat": "<string>",
"chatTag": "<string>",
"force": true,
"profile": "<string>"
}
'import requests
url = "http://localhost:3000/api/v1/permissions/resolve"
payload = {
"denialId": "<string>",
"apply": True,
"capabilities": "<string>",
"chat": "<string>",
"chatTag": "<string>",
"force": True,
"profile": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
denialId: '<string>',
apply: true,
capabilities: '<string>',
chat: '<string>',
chatTag: '<string>',
force: true,
profile: '<string>'
})
};
fetch('http://localhost:3000/api/v1/permissions/resolve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "3000",
CURLOPT_URL => "http://localhost:3000/api/v1/permissions/resolve",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'denialId' => '<string>',
'apply' => true,
'capabilities' => '<string>',
'chat' => '<string>',
'chatTag' => '<string>',
'force' => true,
'profile' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:3000/api/v1/permissions/resolve"
payload := strings.NewReader("{\n \"denialId\": \"<string>\",\n \"apply\": true,\n \"capabilities\": \"<string>\",\n \"chat\": \"<string>\",\n \"chatTag\": \"<string>\",\n \"force\": true,\n \"profile\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:3000/api/v1/permissions/resolve")
.header("Content-Type", "application/json")
.body("{\n \"denialId\": \"<string>\",\n \"apply\": true,\n \"capabilities\": \"<string>\",\n \"chat\": \"<string>\",\n \"chatTag\": \"<string>\",\n \"force\": true,\n \"profile\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/v1/permissions/resolve")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"denialId\": \"<string>\",\n \"apply\": true,\n \"capabilities\": \"<string>\",\n \"chat\": \"<string>\",\n \"chatTag\": \"<string>\",\n \"force\": true,\n \"profile\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"agentCeilings": [
"<string>"
],
"capabilities": [
{
"objectId": "<string>",
"objectType": "<string>",
"permission": "<string>"
}
],
"changedCount": 123,
"confirmation": {
"action": "allow",
"agents": [
"<string>"
],
"capabilities": [
"<string>"
],
"contacts": [
"<string>"
],
"dryRun": true,
"force": true,
"global": true,
"message": "<string>",
"scopes": [
"<string>"
],
"profile": "<string>"
},
"denial": {
"agentId": "<string>",
"contextId": "<string>",
"id": 123,
"missingCapability": "<string>",
"sessionName": "<string>",
"subject": "<string>"
},
"dryRun": true,
"force": true,
"hints": [
"<string>"
],
"label": "<string>",
"operations": [
{
"kind": "<string>",
"message": "<string>",
"status": "planned",
"capability": "<string>",
"target": "<string>"
}
],
"profile": "<string>",
"scopes": [
{
"label": "<string>",
"type": "chat",
"channel": "<string>",
"chatId": "<string>",
"chatTag": "<string>",
"known": true,
"requestedChatId": "<string>",
"taggedChatCount": 123,
"threadChatId": "<string>",
"title": "<string>"
}
],
"tagSlug": "<string>",
"targets": [
{
"id": "<string>",
"type": "<string>"
}
],
"description": "<string>",
"guidance": {
"breakGlass": "<string>",
"canonicalCapability": "<string>",
"inspectCommands": [
"<string>"
],
"nextSteps": [
"<string>"
],
"preferredPath": {
"kind": "<string>",
"message": "<string>",
"suggestedTags": [
{
"capabilities": [
"<string>"
],
"label": "<string>",
"slug": "<string>",
"description": "<string>"
}
],
"allowCommand": "<string>"
},
"rawCapabilityFallback": "<string>",
"requestShape": {
"profileOrTag": "<string>",
"reason": "<string>",
"scope": "<string>",
"ttl": "<string>",
"subject": "<string>"
},
"scope": "<string>",
"candidateCapabilities": [
"<string>"
]
},
"nextCommand": "<string>"
}permissions
Plan or apply a provider-owned fix for a recorded permission denial
POST
/
api
/
v1
/
permissions
/
resolve
Plan or apply a provider-owned fix for a recorded permission denial
curl --request POST \
--url http://localhost:3000/api/v1/permissions/resolve \
--header 'Content-Type: application/json' \
--data '
{
"denialId": "<string>",
"apply": true,
"capabilities": "<string>",
"chat": "<string>",
"chatTag": "<string>",
"force": true,
"profile": "<string>"
}
'import requests
url = "http://localhost:3000/api/v1/permissions/resolve"
payload = {
"denialId": "<string>",
"apply": True,
"capabilities": "<string>",
"chat": "<string>",
"chatTag": "<string>",
"force": True,
"profile": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
denialId: '<string>',
apply: true,
capabilities: '<string>',
chat: '<string>',
chatTag: '<string>',
force: true,
profile: '<string>'
})
};
fetch('http://localhost:3000/api/v1/permissions/resolve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "3000",
CURLOPT_URL => "http://localhost:3000/api/v1/permissions/resolve",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'denialId' => '<string>',
'apply' => true,
'capabilities' => '<string>',
'chat' => '<string>',
'chatTag' => '<string>',
'force' => true,
'profile' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:3000/api/v1/permissions/resolve"
payload := strings.NewReader("{\n \"denialId\": \"<string>\",\n \"apply\": true,\n \"capabilities\": \"<string>\",\n \"chat\": \"<string>\",\n \"chatTag\": \"<string>\",\n \"force\": true,\n \"profile\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:3000/api/v1/permissions/resolve")
.header("Content-Type", "application/json")
.body("{\n \"denialId\": \"<string>\",\n \"apply\": true,\n \"capabilities\": \"<string>\",\n \"chat\": \"<string>\",\n \"chatTag\": \"<string>\",\n \"force\": true,\n \"profile\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3000/api/v1/permissions/resolve")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"denialId\": \"<string>\",\n \"apply\": true,\n \"capabilities\": \"<string>\",\n \"chat\": \"<string>\",\n \"chatTag\": \"<string>\",\n \"force\": true,\n \"profile\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"agentCeilings": [
"<string>"
],
"capabilities": [
{
"objectId": "<string>",
"objectType": "<string>",
"permission": "<string>"
}
],
"changedCount": 123,
"confirmation": {
"action": "allow",
"agents": [
"<string>"
],
"capabilities": [
"<string>"
],
"contacts": [
"<string>"
],
"dryRun": true,
"force": true,
"global": true,
"message": "<string>",
"scopes": [
"<string>"
],
"profile": "<string>"
},
"denial": {
"agentId": "<string>",
"contextId": "<string>",
"id": 123,
"missingCapability": "<string>",
"sessionName": "<string>",
"subject": "<string>"
},
"dryRun": true,
"force": true,
"hints": [
"<string>"
],
"label": "<string>",
"operations": [
{
"kind": "<string>",
"message": "<string>",
"status": "planned",
"capability": "<string>",
"target": "<string>"
}
],
"profile": "<string>",
"scopes": [
{
"label": "<string>",
"type": "chat",
"channel": "<string>",
"chatId": "<string>",
"chatTag": "<string>",
"known": true,
"requestedChatId": "<string>",
"taggedChatCount": 123,
"threadChatId": "<string>",
"title": "<string>"
}
],
"tagSlug": "<string>",
"targets": [
{
"id": "<string>",
"type": "<string>"
}
],
"description": "<string>",
"guidance": {
"breakGlass": "<string>",
"canonicalCapability": "<string>",
"inspectCommands": [
"<string>"
],
"nextSteps": [
"<string>"
],
"preferredPath": {
"kind": "<string>",
"message": "<string>",
"suggestedTags": [
{
"capabilities": [
"<string>"
],
"label": "<string>",
"slug": "<string>",
"description": "<string>"
}
],
"allowCommand": "<string>"
},
"rawCapabilityFallback": "<string>",
"requestShape": {
"profileOrTag": "<string>",
"reason": "<string>",
"scope": "<string>",
"ttl": "<string>",
"subject": "<string>"
},
"scope": "<string>",
"candidateCapabilities": [
"<string>"
]
},
"nextCommand": "<string>"
}Body
application/json
Permission denial id
Apply the planned provider-owned mutations
Optional capabilities to merge into the profile; defaults to the denied capability
Scope contact grants to one chat (canonical chat id, platform chat id, or 'current'). Threads inherit their chat.
Scope contact grants to every chat carrying this chat tag
Explicitly use the global (all chats) contact scope. Prefer --chat; ask the human before going global.
Permission profile/tag to use instead of the suggested one
Response
Success — body conforms to the @Returns schema.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes