Skip to documentation
Documentation navigation

Documentation navigation

Documentation / guides

Commands and gates

Send session input, answer opaque gates, create or restore sessions, and interrupt active work through the typed control plane.

developer

Send control requests

LooprigTransport exposes five control methods. createSession posts optional initial blocks to /v1/sessions; restoreSession posts an empty body to /v1/sessions/{sid}/restore; submit posts a CreateRequest to /input; respondGate posts a gate action; and interrupt posts an empty body to /interrupt.

import {
  GATE_APPROVAL_ACTIONS,
  createBFFClient,
  generateIdempotencyKey,
  textBlock,
} from "@looprig/client";

const client = createBFFClient();
const key = generateIdempotencyKey();
const created = await client.createSession(
  { blocks: [textBlock("Start") ] },
  { idempotencyKey: key },
);

await client.submit(created.session_id, { blocks: [textBlock("Next") ] });
await client.respondGate(created.session_id, gateId, {
  action: GATE_APPROVAL_ACTIONS.approve,
});
await client.interrupt(created.session_id);

Reuse one idempotency key and a byte-identical body across retries of one create. The key is create-only. A different body with the same key is a conflict; restore, input, gate response, and interrupt do not use this header.

Keep gate IDs opaque

The gateId is supplied by session state and is treated as an opaque string. The transport URL-encodes the whole value, but it never splits or interprets it. Use the exported GATE_APPROVAL_ACTIONS values for the action union and keep the UI decision separate from URL construction.

type GateChoice = "approve" | "deny";

async function answer(sessionId: string, gateId: string, choice: GateChoice) {
  const action = choice === "approve"
    ? GATE_APPROVAL_ACTIONS.approve
    : GATE_APPROVAL_ACTIONS.deny;
  return client.respondGate(sessionId, gateId, { action });
}

Every response goes through the matching validator and a non-success response becomes a typed error. See Validation and errors and Transport and ownership before adding a retry policy.

Source

Route construction, body handling, idempotency, gate opacity, and control headers are implemented in sdk/core/src/transport.ts. The shared request and error behavior is covered by sdk/core/test/conformance.test.ts.

Proof

The conformance suite asserts method, path, body, response DTO, and typed error behavior for both transport implementations. The source also shows that restore and interrupt send no request body and that only create accepts Idempotency-Key.

← back to documentation