Create a HUG review
Agent asks the daemon to create a review. When enrolled, the daemon proxies to CliqHub. When in standalone mode, the review is stored locally in SQLite and an event is emitted on the run’s SSE stream for the CLI to prompt the user.
No credential is needed from this machine. From another host, send Authorization: Bearer with a dispatch token CliqHub signed for this daemon or a cliq_tok_… personal token of a user in the daemon’s realm; this only works once the daemon is connected to CliqHub. See Authentication.
curl --request POST \
--url http://127.0.0.1:4900/v1/hug/create_review \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"run_id": "run-abc",
"phase": "review",
"payload": {
"title": "Review: deploy",
"message": "Please review"
},
"timeout_minutes": 30
}
'import requests
url = "http://127.0.0.1:4900/v1/hug/create_review"
payload = {
"run_id": "run-abc",
"phase": "review",
"payload": {
"title": "Review: deploy",
"message": "Please review"
},
"timeout_minutes": 30
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
run_id: 'run-abc',
phase: 'review',
payload: {title: 'Review: deploy', message: 'Please review'},
timeout_minutes: 30
})
};
fetch('http://127.0.0.1:4900/v1/hug/create_review', 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 => "4900",
CURLOPT_URL => "http://127.0.0.1:4900/v1/hug/create_review",
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([
'run_id' => 'run-abc',
'phase' => 'review',
'payload' => [
'title' => 'Review: deploy',
'message' => 'Please review'
],
'timeout_minutes' => 30
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://127.0.0.1:4900/v1/hug/create_review"
payload := strings.NewReader("{\n \"run_id\": \"run-abc\",\n \"phase\": \"review\",\n \"payload\": {\n \"title\": \"Review: deploy\",\n \"message\": \"Please review\"\n },\n \"timeout_minutes\": 30\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://127.0.0.1:4900/v1/hug/create_review")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"run_id\": \"run-abc\",\n \"phase\": \"review\",\n \"payload\": {\n \"title\": \"Review: deploy\",\n \"message\": \"Please review\"\n },\n \"timeout_minutes\": 30\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://127.0.0.1:4900/v1/hug/create_review")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"run_id\": \"run-abc\",\n \"phase\": \"review\",\n \"payload\": {\n \"title\": \"Review: deploy\",\n \"message\": \"Please review\"\n },\n \"timeout_minutes\": 30\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
Not needed from the same machine. From another host: a dispatch JWT CliqHub signed for this daemon, or a cliq_tok_… personal token whose user is in the daemon's realm.
Body
Run requesting the review
1Phase that triggered the gate
1Review body (title, message, fields, …)
Show child attributes
Show child attributes
Auto-escalate timeout
x <= 9007199254740991Explicit reviewer targets
Reviewer user ids
curl --request POST \
--url http://127.0.0.1:4900/v1/hug/create_review \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"run_id": "run-abc",
"phase": "review",
"payload": {
"title": "Review: deploy",
"message": "Please review"
},
"timeout_minutes": 30
}
'import requests
url = "http://127.0.0.1:4900/v1/hug/create_review"
payload = {
"run_id": "run-abc",
"phase": "review",
"payload": {
"title": "Review: deploy",
"message": "Please review"
},
"timeout_minutes": 30
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
run_id: 'run-abc',
phase: 'review',
payload: {title: 'Review: deploy', message: 'Please review'},
timeout_minutes: 30
})
};
fetch('http://127.0.0.1:4900/v1/hug/create_review', 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 => "4900",
CURLOPT_URL => "http://127.0.0.1:4900/v1/hug/create_review",
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([
'run_id' => 'run-abc',
'phase' => 'review',
'payload' => [
'title' => 'Review: deploy',
'message' => 'Please review'
],
'timeout_minutes' => 30
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://127.0.0.1:4900/v1/hug/create_review"
payload := strings.NewReader("{\n \"run_id\": \"run-abc\",\n \"phase\": \"review\",\n \"payload\": {\n \"title\": \"Review: deploy\",\n \"message\": \"Please review\"\n },\n \"timeout_minutes\": 30\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://127.0.0.1:4900/v1/hug/create_review")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"run_id\": \"run-abc\",\n \"phase\": \"review\",\n \"payload\": {\n \"title\": \"Review: deploy\",\n \"message\": \"Please review\"\n },\n \"timeout_minutes\": 30\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://127.0.0.1:4900/v1/hug/create_review")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"run_id\": \"run-abc\",\n \"phase\": \"review\",\n \"payload\": {\n \"title\": \"Review: deploy\",\n \"message\": \"Please review\"\n },\n \"timeout_minutes\": 30\n}"
response = http.request(request)
puts response.read_body