Prendre un lease puis le libérer
Prenez un lease exclusif sur une ressource avec coordination.lease, voyez qui le détient, et relâchez-le quand vous avez fini.
coordination.lease
Prenez un lease exclusif sur une ressource avec coordination.lease, voyez qui le détient, et relâchez-le quand vous avez fini.
coordination.leaseFaites passer actions d’agents, hash de contenu, contrôles d’API, requêtes DNS, webhooks, appels LLM et commits git par Intramedial. Obtenez un reçu signé vérifiable par tous – sans nous croire.
Deux agents ne doivent pas déployer en production en même temps. Vous donnez un lease à la ressource : le premier agent le détient, le second est refusé et informé de qui le détient et de combien de temps attendre. Un lease jamais libéré expire de lui-même.
Le code lit la clé depuis INTRAMEDIAL_KEY. Gardez-la dans votre shell ou votre coffre à secrets, jamais dans un fichier que vous commitez. Les appels qui exigent une personne connectée ne peuvent pas utiliser de clé : c’est la console qui les fait.
Demandez la ressource en tant qu’agent qui la veut. Une ressource libre renvoie un lease avec une expiration.
Une ressource libre répond { ok: true, lease }. Le lease porte son identifiant, son détenteur et son expiration.
{
"ok": true,
"lease": {
"id": "lease_4c1e",
"resource": "lock:deploy/production",
"holder": "did:web:acme.example:agent:release",
"expiresAtMs": ,
: { : , : [] },
: ,
: {}
}
}lease_held.coordination.leasecoordination-lease
curl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/lease \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/lease", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "lock:deploy/production",
actorDid: "did:web:acme.example:agent:release",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/lease",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release",
},
timeout=30,
)
print(res.status_code, res.json())Un second agent qui demande la même ressource est refusé avec lease_held, le DID du détenteur et une temporisation dans stampede.waitMs. Chaque lease dure 30 000 ms par défaut ; la route ne lit pas ttlMs.
curl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/lease \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:cost"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/lease", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "lock:deploy/production",
actorDid: "did:web:acme.example:agent:cost",
}),
});
const body = await res.json();
if (!body.ok) console.log(body.reason, "held by", body.holder, "wait", body.stampede?.waitMs, "ms");import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/lease",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:cost",
},
timeout=30,
)
body = res.json()
if not body.get("ok"):
print(body["reason"], "held by", body["holder"], "wait", body["stampede"]["waitMs"], "ms")Envoyez la ressource et l’agent ; release répond released et releasedIds. Un lease jamais libéré expire et une alarme le reprend.
curl -sS -X POST https://api.intramedial.com/api/v1/acp/coordination/release \
-H "Authorization: Bearer $INTRAMEDIAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release"
}'const res = await fetch("https://api.intramedial.com/api/v1/acp/coordination/release", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INTRAMEDIAL_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
resource: "lock:deploy/production",
actorDid: "did:web:acme.example:agent:release",
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
"https://api.intramedial.com/api/v1/acp/coordination/release",
headers={"Authorization": "Bearer " + os.environ["INTRAMEDIAL_KEY"]},
json={
"resource": "lock:deploy/production",
"actorDid": "did:web:acme.example:agent:release",
},
timeout=30,
)
print(res.status_code, res.json())Copié de: /docs/coordination-lease
Le registre est en ajout seul et scellé sous des racines de Merkle. L’heure d’une entrée est l’horloge propre d’Intramedial, et un bundle signé peut être vérifié hors ligne avec la clé publiée.
Demandez un lease détenu, lisez la temporisation que nomme le plan et réessayez jusqu’à ce que le créneau soit à vous.
coordination.leaseIndiquez ce qu’un agent s’apprête à faire sur une ressource, et laissez le plan la comparer aux revendications ouvertes.
civics.claimsDétenez un lease sur un rôle, assumez-le via le plan pour obtenir un identifiant court, utilisez-le et libérez le lease.
iam.assumecoordination.leaseUn court e-mail quand nous ajoutons des recettes. Rien d’autre, et désabonnement possible depuis chaque message.
Sans compte : 35 appels sur 7 jours sur les routes attest, avec des reçus marqués test. Inscrivez-vous quand vous voulez continuer.