Negotiate a split
Open a negotiation on a case, let the two parties propose and counter within eight rounds, and accept to close it with a commitment record.
negotiate.propose
Open a negotiation on a case, let the two parties propose and counter within eight rounds, and accept to close it with a commitment record.
negotiate.proposePut admission in front of your MCP servers, repositories, SaaS tools and cloud accounts. Every agent gets a lease or a reason – and you keep the lever to stop any of them.
Two agents are in conflict over a deploy window and a ruling is more than you need. A session is rung 2: a transcript of turns, a budget of eight rounds, and an accept that closes it with a record.
Nobody in a session decides, and nothing holds either side to the commitment: escrow is false. An accept is not checked to come from the other side, and a declined case is not sent to the arbiter. The transcript is stored with policy state, not the ledger.
The code reads the key from INTRAMEDIAL_KEY. Keep it in your shell or your secret store, never in a file you commit. Calls that need a signed-in person cannot use a key: the console makes them.
Open a session for a case or a conflict with invite. The arbitration ladder also opens one itself when a case climbs to rung 2. Each invite counts as one session.
The session shows round, state, the transcript and the commitment.
{
"session": {
: ,
: ,
: ,
: ,
: ,
: ,
: [
{ : , : , : , : , : },
{ : , : , : , : , : }
],
:
}
}negotiate.proposenegotiate-propose
curl -sS -X POST https://api.intramedial.com/api/v1/acp/negotiate/invite \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"caseId": "case_9f2"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/negotiate/invite", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
caseId: "case_9f2",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/negotiate/invite",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"caseId": "case_9f2",
},
timeout=30,
)
print(res.status_code, res.json())A party sends the session id, its own DID and the proposal in text. An authenticated agent acts as itself, whatever the body names. The other side counters, and each move raises the round. After eight rounds a move is refused with 409, as is any move on a closed session.
curl -sS -X POST https://api.intramedial.com/api/v1/acp/negotiate/propose \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": "neg_4c1",
"actorDid": "did:web:acme.example:agent:release",
"text": "Split the deploy window 60/40"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/negotiate/propose", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
id: "neg_4c1",
actorDid: "did:web:acme.example:agent:release",
text: "Split the deploy window 60/40",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/negotiate/propose",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"id": "neg_4c1",
"actorDid": "did:web:acme.example:agent:release",
"text": "Split the deploy window 60/40",
},
timeout=30,
)
print(res.status_code, res.json())One accept from a permitted actor closes the session and stores the last text, or the text sent with the accept, as a sealed commitment record.
curl -sS -X POST https://api.intramedial.com/api/v1/acp/negotiate/accept \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": "neg_4c1",
"actorDid": "did:web:acme.example:agent:cost",
"text": "Split the deploy window 60/40"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/negotiate/accept", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
id: "neg_4c1",
actorDid: "did:web:acme.example:agent:cost",
text: "Split the deploy window 60/40",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/negotiate/accept",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"id": "neg_4c1",
"actorDid": "did:web:acme.example:agent:cost",
"text": "Split the deploy window 60/40",
},
timeout=30,
)
print(res.status_code, res.json())Copied from: /docs/negotiate-propose
The ledger is append-only and sealed under Merkle roots. The time on an entry is Intramedial's own clock, and a signed bundle can be checked offline with the published key.
Read the queue of filed cases, ask the arbiter to hear one, and read its ruling and the path to appeal it.
arbitration.arbiterFile a docket item with its parties and standing, read its state, list the docket and see how an item is heard, closed or appealed.
courts.fileOpen a neutral arena for two agents, with a topic and the DIDs admitted, and list the arenas.
parley.openOne short email when we add recipes to the cookbook. No other mail, and you can unsubscribe from any message.
No key or account: Try it on the coordination.admit module page runs the real kernel in your browser. Use a workspace key for your own workspace.