Pipelines
Continuous integration runs, and asking an agent to fix a red one
On this page(6 sections)
Read the runs and the jobs inside them, re-run or cancel one, and mark the board read. The interesting one hands a failing run to an agent rather than to you.
GET/ci/runsPipeline runs across the repos
What the forges are reporting for every workspace repo that has a remote, served from a cache and filled in on demand. Repos whose notifications are not wired up say so.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
reposWhich workspace repositories are wired to… | object[] |
repoWhich workspace repository | string |
hostWhich forge it lives on | "github" | "gitlab" |
projectThe project there | string |
urlIts page on the forge | string |
hookWarningPresent when the sandbox could not… | string |
runsRuns across all of them, newest… | object[] |
repoWhich workspace repository it belongs to | string |
hostWhich forge is running it | "github" | "gitlab" |
projectThe project there, as that forge… | string |
runIdThe forge's own id for the… | number |
titleThe run's headline, usually the commit… | string |
authorNameWho the forge credits for setting… | string |
authorAvatarUrlTheir picture, hosted by the forge | string |
triggerWhat set it off, in the… | string |
branchWhich branch | string |
shaWhich commit | string |
statusHow it is going | "running" | "success" | "failed" | "canceled" … (5) |
urlIts page on the forge | string |
createdAtWhen it started, in milliseconds | number |
durationSecondsHow long it took | number |
failedJobsWhat broke, by name | string[] |
seenAtWhen this was last looked at,… | number |
curl "$SANDBOX/ci/runs" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.runs();POST/ci/runs/rerunRun a pipeline again
Asks the forge to re-run one pipeline. The daemon only passes the request along.
What you send
| Field | Type | Where |
|---|---|---|
reporequiredWhich workspace repository | string | body |
runIdrequiredWhich run, by the forge's own… | number | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/ci/runs/rerun" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"root","runId":1}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.rerun({
"repo": "root",
"runId": 1
});POST/ci/runs/cancelCancel a pipeline run
Asks the forge to stop a run in progress.
What you send
| Field | Type | Where |
|---|---|---|
reporequiredWhich workspace repository | string | body |
runIdrequiredWhich run, by the forge's own… | number | body |
What comes back
| Field | Type |
|---|---|
okAlways true | true |
curl -X POST "$SANDBOX/ci/runs/cancel" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"root","runId":1}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.cancel({
"repo": "root",
"runId": 1
});POST/ci/runs/jobsThe steps inside one pipeline run
Each job in a run with its outcome, which is where you look to find out what actually broke.
What you send
| Field | Type | Where |
|---|---|---|
reporequiredWhich workspace repository | string | body |
runIdrequiredWhich run, by the forge's own… | number | body |
What comes back
| Field | Type |
|---|---|
jobsThe steps inside one run | object[] |
nameThe job's name | string |
statusHow it went | "running" | "success" | "failed" | "canceled" … (5) |
stageWhich stage it belongs to, where… | string |
needsWhich jobs in this run it… | string[] |
startedAtWhen it began, in milliseconds | number |
finishedAtWhen it ended, in milliseconds | number |
durationSecondsHow long it took | number |
webUrlIts page on the forge, which… | string |
curl -X POST "$SANDBOX/ci/runs/jobs" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"root","runId":1}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.jobs({
"repo": "root",
"runId": 1
});POST/ci/fixPut an agent on a broken pipeline
Opens a fresh isolated conversation already holding the failure: which job, which repo, what it said. The answer names the conversation so you can open it.
What you send
| Field | Type | Where |
|---|---|---|
reporequiredWhich workspace repository | string | body |
runIdrequiredWhich run, by the forge's own… | number | body |
pickWhich model to open the conversation… | object | body |
agentrequiredWhich provider | string | body |
modelrequiredWhich of its models | string | body |
What comes back
| Field | Type |
|---|---|
conversationIdThe conversation that was opened, already… | string |
curl -X POST "$SANDBOX/ci/fix" \
-H "x-intentic-control: $INTENTIC_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"root","runId":1,"pick":{"agent":"…","model":"claude-sonnet-4-6"}}'import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.fix({
"repo": "root",
"runId": 1,
"pick": {
"agent": "…",
"model": "claude-sonnet-4-6"
}
});POST/ci/seenMark the pipelines as read
Silences the badge for breakages already looked at. Takes nothing, because the view is read as a whole, and the daemon stamps its own clock so a browser with the wrong time cannot mark future failures as already seen.
What you send
Nothing. Call it as it is.
What comes back
| Field | Type |
|---|---|
seenAtThe timestamp that was written, handed… | number |
curl -X POST "$SANDBOX/ci/seen" \
-H "x-intentic-control: $INTENTIC_TOKEN"import { sandbox } from "@intentic/sandbox-client";
const result = await sandbox.ci.seen();