Pointy Backend API

v1.0.0
Base URL
/backend

HTTP API served by the Pointy backend. All routes are mounted under the /backend prefix by the reverse proxy.

autocomplete

/autocomplete

POST
/backend/autocomplete

Returns autocomplete suggestions for a field, evaluated against the user repository.

Body

application/json;charset=utf-8
autocompletestringrequired
contextobjectrequired
limitinteger[-9223372036854776000, 9223372036854776000]
querystringrequired
templatestringrequired

Parameters

commitstringquery

Response

200OKArray<string>
400Bad Request

Invalid body or commit

/autocomplete
curl -X POST '/backend/autocomplete' \
  -H 'Content-Type: application/json;charset=utf-8' \
  -d '{
    "autocomplete": "string",
    "context": {},
    "limit": -9223372036854776000,
    "query": "string",
    "template": "string"
  }'
const response = await fetch('/backend/autocomplete', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  body: JSON.stringify({
      "autocomplete": "string",
      "context": {},
      "limit": -9223372036854776000,
      "query": "string",
      "template": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "autocomplete": "string",
  "context": {},
  "limit": -9223372036854776000,
  "query": "string",
  "template": "string"
}

response = requests.post('/backend/autocomplete', json=payload)
data = response.json()
Request Body
{
  "autocomplete": "string",
  "context": {},
  "limit": -9223372036854776000,
  "query": "string",
  "template": "string"
}
200
[
  "string"
]

cluster-status-stream

/cluster-status-stream

GET
/backend/cluster-status-stream

Streams the current SLURM cluster availability, the reason for any degradation, and subsequent status changes.

Response

200OKStreamingBody<binary>
/cluster-status-stream
curl -X GET '/backend/cluster-status-stream'
const response = await fetch('/backend/cluster-status-stream', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/cluster-status-stream')
data = response.json()
200
<binary>

commit-hash

/commit-hash

GET
/backend/commit-hash

Returns the commit hash the user repository is currently checked out at.

Response

200OKstring
/commit-hash
curl -X GET '/backend/commit-hash'
const response = await fetch('/backend/commit-hash', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/commit-hash')
data = response.json()
200
string

ingest-stream

/ingest-stream

GET
/backend/ingest-stream

Streams ingest job snapshots and progress updates as server-sent events.

Response

200OKStreamingBody<binary>
/ingest-stream
curl -X GET '/backend/ingest-stream'
const response = await fetch('/backend/ingest-stream', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/ingest-stream')
data = response.json()
200
<binary>

job-ended

/job-ended

POST
/backend/job-ended

Called by the Slurm job-completion hook when a job ends; wakes the build watchers waiting on that job name.

Parameters

namestringrequiredquery

Response

200OK
400Bad Request

Invalid name

/job-ended
curl -X POST '/backend/job-ended'
const response = await fetch('/backend/job-ended', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('/backend/job-ended')
data = response.json()

notices

/notices

GET
/backend/notices

Returns evaluation notices (warnings and errors) for a step.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery

Response

200OKDynamicJson
400Bad Request

Invalid commit or id

/notices
curl -X GET '/backend/notices'
const response = await fetch('/backend/notices', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/notices')
data = response.json()
200
{}

presets

/presets

GET
/backend/presets

Returns the field presets defined in the user repository.

Parameters

commitstringquery

Response

200OKDynamicJson
400Bad Request

Invalid commit

/presets
curl -X GET '/backend/presets'
const response = await fetch('/backend/presets', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/presets')
data = response.json()
200
{}

project-review

/project-review

GET
/backend/project-review

Reports how every step in a project at one revision compares with its reviewed revision, together with that reviewed revision.

Parameters

project_idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery

Response

200OKobject
400Bad Request

Invalid commit or project_id

/project-review
curl -X GET '/backend/project-review'
const response = await fetch('/backend/project-review', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/project-review')
data = response.json()
200
{}

project-rollup

/project-rollup

GET
/backend/project-rollup

Returns, for every direct child project of a project in its effective order, the number of steps reachable below it and the counts of their statuses, recursively and counting each step once per child project, optionally at a specific user-repo commit.

Parameters

project_idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery

Response

200OKDynamicJson
400Bad Request

Invalid commit or project_id

/project-rollup
curl -X GET '/backend/project-rollup'
const response = await fetch('/backend/project-rollup', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/project-rollup')
data = response.json()
200
{}

project-status

/project-status

POST
/backend/project-status

Re-evaluates a project's step statuses and broadcasts them on the step status stream.

Parameters

project_idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery

Response

200OK
400Bad Request

Invalid commit or project_id

/project-status
curl -X POST '/backend/project-status'
const response = await fetch('/backend/project-status', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('/backend/project-status')
data = response.json()

projects

/projects

GET
/backend/projects

Returns every project keyed by id, including the root project 0, optionally at a specific user-repo commit. Each project lists its steps and subprojects in children; revisions written in the former steps format are converted to this shape.

Parameters

commitstringquery

Response

200OKDynamicJson
400Bad Request

Invalid commit

/projects
curl -X GET '/backend/projects'
const response = await fetch('/backend/projects', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/projects')
data = response.json()
200
{}

/projects

POST
/backend/projects

Creates a project from its name and preset or templates, and appends it to the children of the parent project (the root project 0 by default) in one commit. Returns the evaluated project.

Body

application/json;charset=utf-8

A project's name and exactly one of preset or templates.

namestringrequired
presetstring
templatesArray<string>

Parameters

parent_idinteger[-9223372036854776000, 9223372036854776000]query

Response

200OKDynamicJson
400Bad Request

Invalid body or parent_id

/projects
curl -X POST '/backend/projects' \
  -H 'Content-Type: application/json;charset=utf-8' \
  -d '{
    "name": "string",
    "preset": "string",
    "templates": [
      "string"
    ]
  }'
const response = await fetch('/backend/projects', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  body: JSON.stringify({
      "name": "string",
      "preset": "string",
      "templates": [
        "string"
      ]
    }),
});

const data = await response.json();
import requests

payload = {
  "name": "string",
  "preset": "string",
  "templates": [
    "string"
  ]
}

response = requests.post('/backend/projects', json=payload)
data = response.json()
Request Body
{
  "name": "string",
  "preset": "string",
  "templates": [
    "string"
  ]
}
200
{}

/projects

PATCH
/backend/projects

Replaces a project's name and preset or templates; its children are left unchanged.

Body

application/json;charset=utf-8

A project's name and exactly one of preset or templates.

namestringrequired
presetstring
templatesArray<string>

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery

Response

200OK
400Bad Request

Invalid body or id

/projects
curl -X PATCH '/backend/projects' \
  -H 'Content-Type: application/json;charset=utf-8' \
  -d '{
    "name": "string",
    "preset": "string",
    "templates": [
      "string"
    ]
  }'
const response = await fetch('/backend/projects', {
  method: 'PATCH',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  body: JSON.stringify({
      "name": "string",
      "preset": "string",
      "templates": [
        "string"
      ]
    }),
});

const data = await response.json();
import requests

payload = {
  "name": "string",
  "preset": "string",
  "templates": [
    "string"
  ]
}

response = requests.patch('/backend/projects', json=payload)
data = response.json()
Request Body
{
  "name": "string",
  "preset": "string",
  "templates": [
    "string"
  ]
}

/projects/batch

POST
/backend/projects/batch

Applies an ordered list of project tree operations (update, link, unlink, order, hide, delete) validated as a whole and written in one commit. Refuses to delete the root project 0, reviewed steps, or steps that remaining steps depend on. Validation failures return 409 with a human message; an empty list returns 400.

Body

application/json;charset=utf-8
Array<TreeOp>
Show child attributes
childobject | object

A step or project child of a project.

childrenArray<ChildRef>
Show child attributes

A step or project child of a project.

One of
stepobjectrequired
Show child attributes
idintegerrequired
projectobjectrequired
Show child attributes
idintegerrequired
fieldsProjectFields

A project's name and exactly one of preset or templates.

Show child attributes
namestringrequired
presetstring
templatesArray<string>
hiddenboolean
opstringrequired

One of update, link, unlink, order, hide, delete.

parentinteger
projectinteger

Response

200OK
400Bad Request

Invalid body

/projects/batch
curl -X POST '/backend/projects/batch' \
  -H 'Content-Type: application/json;charset=utf-8' \
  -d '[
    {
      "child": {
        "step": {
          "id": 0
        }
      },
      "children": [
        {
          "step": {
            "id": 0
          }
        }
      ],
      "fields": {
        "name": "string",
        "preset": "string",
        "templates": [
          "string"
        ]
      },
      "hidden": true,
      "op": "string",
      "parent": 0,
      "project": 0
    }
  ]'
const response = await fetch('/backend/projects/batch', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  body: JSON.stringify([
      {
        "child": {
          "step": {
            "id": 0
          }
        },
        "children": [
          {
            "step": {
              "id": 0
            }
          }
        ],
        "fields": {
          "name": "string",
          "preset": "string",
          "templates": [
            "string"
          ]
        },
        "hidden": true,
        "op": "string",
        "parent": 0,
        "project": 0
      }
    ]),
});

const data = await response.json();
import requests

payload = [
  {
    "child": {
      "step": {
        "id": 0
      }
    },
    "children": [
      {
        "step": {
          "id": 0
        }
      }
    ],
    "fields": {
      "name": "string",
      "preset": "string",
      "templates": [
        "string"
      ]
    },
    "hidden": True,
    "op": "string",
    "parent": 0,
    "project": 0
  }
]

response = requests.post('/backend/projects/batch', json=payload)
data = response.json()
Request Body
[
  {
    "child": {
      "step": {
        "id": 0
      }
    },
    "children": [
      {
        "step": {
          "id": 0
        }
      }
    ],
    "fields": {
      "name": "string",
      "preset": "string",
      "templates": [
        "string"
      ]
    },
    "hidden": true,
    "op": "string",
    "parent": 0,
    "project": 0
  }
]

run-step

/run-step

POST
/backend/run-step

Triggers a build of a step.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery

Response

200OK
400Bad Request

Invalid commit or id

/run-step
curl -X POST '/backend/run-step'
const response = await fetch('/backend/run-step', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('/backend/run-step')
data = response.json()

scratch

/scratch

GET
/backend/scratch

Returns the configured scratch directory root, or null when scratch is not configured.

Response

200OKScratchRootResponse
/scratch
curl -X GET '/backend/scratch'
const response = await fetch('/backend/scratch', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/scratch')
data = response.json()
200
{
  "root": "string"
}

/scratch/list

GET
/backend/scratch/list

Lists the entries of a directory inside the scratch root, directories first.

Parameters

pathstringquery

Response

200OKScratchListing
400Bad Request

Invalid path

/scratch/list
curl -X GET '/backend/scratch/list'
const response = await fetch('/backend/scratch/list', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/scratch/list')
data = response.json()
200
{
  "entries": [
    {
      "directory": true,
      "name": "string",
      "size": 0
    }
  ],
  "path": "string"
}

/scratch/wrap

POST
/backend/scratch/wrap

Starts an ingest job that wraps a directory inside the scratch root into a step.

Body

application/json;charset=utf-8
pathstringrequired

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery

Response

202Acceptedstring
400Bad Request

Invalid body or id

/scratch/wrap
curl -X POST '/backend/scratch/wrap' \
  -H 'Content-Type: application/json;charset=utf-8' \
  -d '{
    "path": "string"
  }'
const response = await fetch('/backend/scratch/wrap', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  body: JSON.stringify({
      "path": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "path": "string"
}

response = requests.post('/backend/scratch/wrap', json=payload)
data = response.json()
Request Body
{
  "path": "string"
}
202
string

src-files

/src-files

GET
/backend/src-files

Lists source files available to a step, optionally at a specific user-repo commit.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery
pathstringquery

Response

200OKArray<DirEntry>
400Bad Request

Invalid path or commit or id

/src-files
curl -X GET '/backend/src-files'
const response = await fetch('/backend/src-files', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/src-files')
data = response.json()
200
[
  {
    "isDir": true,
    "mimeType": "string",
    "name": "string",
    "seekable": true,
    "size": 0,
    "viewable": true
  }
]

/src-files

POST
/backend/src-files

Creates a source file and commits it to the user repository.

Body

text/plain;charset=utf-8
string

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
pathstringrequiredquery

Response

200OK
400Bad Request

Invalid body or path or id

/src-files
curl -X POST '/backend/src-files' \
  -H 'Content-Type: text/plain;charset=utf-8' \
  -d '"string"'
const response = await fetch('/backend/src-files', {
  method: 'POST',
  headers: {
    'Content-Type': 'text/plain;charset=utf-8',
  },
  body: JSON.stringify("string"),
});

const data = await response.json();
import requests

payload = "string"

response = requests.post('/backend/src-files', json=payload)
data = response.json()
Request Body
string

/src-files

PUT
/backend/src-files

Updates a source file and commits it to the user repository.

Body

text/plain;charset=utf-8
string

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
pathstringrequiredquery

Response

200OK
400Bad Request

Invalid body or path or id

/src-files
curl -X PUT '/backend/src-files' \
  -H 'Content-Type: text/plain;charset=utf-8' \
  -d '"string"'
const response = await fetch('/backend/src-files', {
  method: 'PUT',
  headers: {
    'Content-Type': 'text/plain;charset=utf-8',
  },
  body: JSON.stringify("string"),
});

const data = await response.json();
import requests

payload = "string"

response = requests.put('/backend/src-files', json=payload)
data = response.json()
Request Body
string

/src-files

DELETE
/backend/src-files

Deletes a source file and commits it to the user repository.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
pathstringrequiredquery

Response

200OK
400Bad Request

Invalid path or id

/src-files
curl -X DELETE '/backend/src-files'
const response = await fetch('/backend/src-files', {
  method: 'DELETE',
});

const data = await response.json();
import requests

response = requests.delete('/backend/src-files')
data = response.json()

/src-files/download

GET
/backend/src-files/download

Downloads a single source file.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery
pathstringrequiredquery

Response

200OKStreamingBody<binary>
400Bad Request

Invalid path or commit or id

/src-files/download
curl -X GET '/backend/src-files/download'
const response = await fetch('/backend/src-files/download', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/src-files/download')
data = response.json()
200
"<binary>"

/src-files/seek

GET
/backend/src-files/seek

Returns a bounded source-file chunk. Specify exactly one of line or offset and a nonzero signed byte count: positive bytes read forward from the anchor; negative bytes read backward and end at the anchor.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery
pathstringrequiredquery
lineinteger[-9223372036854776000, 9223372036854776000]query
offsetinteger[-9223372036854776000, 9223372036854776000]query
bytesinteger[-9223372036854776000, 9223372036854776000]requiredquery

Response

200OKFileChunk
400Bad Request

Invalid bytes or offset or line or path or commit or id

/src-files/seek
curl -X GET '/backend/src-files/seek'
const response = await fetch('/backend/src-files/seek', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/src-files/seek')
data = response.json()
200
{
  "content": "string",
  "endLine": -9223372036854776000,
  "endOffset": -9223372036854776000,
  "eof": true,
  "startLine": -9223372036854776000,
  "startOffset": -9223372036854776000
}

step

/step

POST
/backend/step

Creates a step, optionally seeded from a source step.

Body

application/json
DynamicJson

Parameters

project_idinteger[-9223372036854776000, 9223372036854776000]query
source_idinteger[-9223372036854776000, 9223372036854776000]query

Response

200OKDynamicJson
400Bad Request

Invalid body or source_id or project_id

/step
curl -X POST '/backend/step' \
  -H 'Content-Type: application/json' \
  -d '{}'
const response = await fetch('/backend/step', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({}),
});

const data = await response.json();
import requests

payload = {}

response = requests.post('/backend/step', json=payload)
data = response.json()
Request Body
{}
200
{}

/step

PATCH
/backend/step

Updates an existing step record.

Body

application/json
DynamicJson

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery

Response

200OK
400Bad Request

Invalid body or id

/step
curl -X PATCH '/backend/step' \
  -H 'Content-Type: application/json' \
  -d '{}'
const response = await fetch('/backend/step', {
  method: 'PATCH',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({}),
});

const data = await response.json();
import requests

payload = {}

response = requests.patch('/backend/step', json=payload)
data = response.json()
Request Body
{}

step-config

/step-config

GET
/backend/step-config

Returns the step configuration defined in the user repository.

Parameters

commitstringquery

Response

200OKDynamicJson
400Bad Request

Invalid commit

/step-config
curl -X GET '/backend/step-config'
const response = await fetch('/backend/step-config', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/step-config')
data = response.json()
200
{}

step-files

/step-files

GET
/backend/step-files

Lists files in a step's output directory.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery
pathstringquery

Response

200OKArray<DirEntry>
400Bad Request

Invalid path or commit or id

/step-files
curl -X GET '/backend/step-files'
const response = await fetch('/backend/step-files', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/step-files')
data = response.json()
200
[
  {
    "isDir": true,
    "mimeType": "string",
    "name": "string",
    "seekable": true,
    "size": 0,
    "viewable": true
  }
]

/step-files/bundle/{step-id}/{commit}/{segments}

GET
/backend/step-files/bundle/{step-id}/{commit}/{segments}

Serves a raw file within an immutable step-output bundle.

Parameters

step-idinteger[-9223372036854776000, 9223372036854776000]requiredpath
commitstringrequiredpath
segmentsstringrequiredpath

Response

200OKFileDownload<binary>
404Not Found

step-id or commit or segments not found

/step-files/bundle/{step-id}/{commit}/{segments}
curl -X GET '/backend/step-files/bundle/{step-id}/{commit}/{segments}'
const response = await fetch('/backend/step-files/bundle/{step-id}/{commit}/{segments}', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/step-files/bundle/{step-id}/{commit}/{segments}')
data = response.json()
200
"<binary>"

/step-files/download

GET
/backend/step-files/download

Downloads a single file from a step's output directory.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery
pathstringrequiredquery

Response

200OKStreamingBody<binary>
400Bad Request

Invalid path or commit or id

/step-files/download
curl -X GET '/backend/step-files/download'
const response = await fetch('/backend/step-files/download', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/step-files/download')
data = response.json()
200
"<binary>"

/step-files/extras

GET
/backend/step-files/extras

Returns a step's JSON extras payload.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery
pathstringquery

Response

200OKDynamicJson
400Bad Request

Invalid path or commit or id

/step-files/extras
curl -X GET '/backend/step-files/extras'
const response = await fetch('/backend/step-files/extras', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/step-files/extras')
data = response.json()
200
{}

/step-files/raw/{segments}

GET
/backend/step-files/raw/{segments}

Serves the raw bytes of a file from a step's output directory.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery
segmentsstringrequiredpath

Response

200OKFileDownload<binary>
400Bad Request

Invalid commit or id

404Not Found

segments not found

/step-files/raw/{segments}
curl -X GET '/backend/step-files/raw/{segments}'
const response = await fetch('/backend/step-files/raw/{segments}', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/step-files/raw/{segments}')
data = response.json()
200
"<binary>"

/step-files/seek

GET
/backend/step-files/seek

Returns a bounded file chunk. Specify exactly one of line or offset and a nonzero signed byte count: positive bytes read forward from the anchor; negative bytes read backward and end at the anchor.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery
pathstringrequiredquery
lineinteger[-9223372036854776000, 9223372036854776000]query
offsetinteger[-9223372036854776000, 9223372036854776000]query
bytesinteger[-9223372036854776000, 9223372036854776000]requiredquery

Response

200OKFileChunk
400Bad Request

Invalid bytes or offset or line or path or commit or id

/step-files/seek
curl -X GET '/backend/step-files/seek'
const response = await fetch('/backend/step-files/seek', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/step-files/seek')
data = response.json()
200
{
  "content": "string",
  "endLine": -9223372036854776000,
  "endOffset": -9223372036854776000,
  "eof": true,
  "startLine": -9223372036854776000,
  "startOffset": -9223372036854776000
}

step-log

/step-log

GET
/backend/step-log

Returns the build log of a step.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery

Response

200OKstring
400Bad Request

Invalid commit or id

/step-log
curl -X GET '/backend/step-log'
const response = await fetch('/backend/step-log', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/step-log')
data = response.json()
200
string

step-review

/step-review

POST
/backend/step-review

Records the viewed revision as a step's reviewed revision, together with who reviewed it and their comments, when there is no review or its output is unchanged. Returns whether the viewed output differs from the reviewed one.

Body

application/json;charset=utf-8
reviewCommentsstringrequired
reviewedBystringrequired

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery

Response

200OKboolean
400Bad Request

Invalid body or commit or id

/step-review
curl -X POST '/backend/step-review' \
  -H 'Content-Type: application/json;charset=utf-8' \
  -d '{
    "reviewComments": "string",
    "reviewedBy": "string"
  }'
const response = await fetch('/backend/step-review', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  body: JSON.stringify({
      "reviewComments": "string",
      "reviewedBy": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "reviewComments": "string",
  "reviewedBy": "string"
}

response = requests.post('/backend/step-review', json=payload)
data = response.json()
Request Body
{
  "reviewComments": "string",
  "reviewedBy": "string"
}
200
true

/step-review

DELETE
/backend/step-review

Removes a step's review.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery

Response

200OK
400Bad Request

Invalid id

/step-review
curl -X DELETE '/backend/step-review'
const response = await fetch('/backend/step-review', {
  method: 'DELETE',
});

const data = await response.json();
import requests

response = requests.delete('/backend/step-review')
data = response.json()

step-status-stream

/step-status-stream

GET
/backend/step-status-stream

Streams snapshot and heartbeat SSE events for every project's steps.

Response

200OKStreamingBody<binary>
/step-status-stream
curl -X GET '/backend/step-status-stream'
const response = await fetch('/backend/step-status-stream', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/step-status-stream')
data = response.json()
200
<binary>

stop-step

/stop-step

POST
/backend/stop-step

Stops a running step build.

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery
commitstringquery

Response

200OK
400Bad Request

Invalid commit or id

/stop-step
curl -X POST '/backend/stop-step'
const response = await fetch('/backend/stop-step', {
  method: 'POST',
});

const data = await response.json();
import requests

response = requests.post('/backend/stop-step')
data = response.json()

unfiled

/unfiled

GET
/backend/unfiled

Returns steps not linked from any project, with evaluated definitions, optionally at a specific user-repo commit. Unreadable raw project links fail the request. Step definitions carry lastModifiedAt and createdAt.

Parameters

commitstringquery

Response

200OKDynamicJson
400Bad Request

Invalid commit

/unfiled
curl -X GET '/backend/unfiled'
const response = await fetch('/backend/unfiled', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/unfiled')
data = response.json()
200
{}

upload

/upload

POST
/backend/upload

Stages files uploaded into a step's source directory and starts an ingest job.

Body

multipart/form-data
filesArray<string>required

Parameters

idinteger[-9223372036854776000, 9223372036854776000]requiredquery

Response

202Acceptedstring
400Bad Request

Invalid id

/upload
curl -X POST '/backend/upload' \
  -H 'Content-Type: multipart/form-data' \
  -d '{
    "files": [
      "<binary>"
    ]
  }'
const response = await fetch('/backend/upload', {
  method: 'POST',
  headers: {
    'Content-Type': 'multipart/form-data',
  },
  body: JSON.stringify({
      "files": [
        "<binary>"
      ]
    }),
});

const data = await response.json();
import requests

payload = {
  "files": [
    "<binary>"
  ]
}

response = requests.post('/backend/upload', json=payload)
data = response.json()
Request Body
{
  "files": [
    "<binary>"
  ]
}
202
string

user-repo-info

/user-repo-info

GET
/backend/user-repo-info

Returns the configured user repository URL and branch.

Response

200OKUserRepoInfo
/user-repo-info
curl -X GET '/backend/user-repo-info'
const response = await fetch('/backend/user-repo-info', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/backend/user-repo-info')
data = response.json()
200
{
  "branch": "string",
  "url": "string"
}

Models

AgentApplyView

object
invalidatedProjectIdsArray<integer>required
invalidatedStepIdsArray<integer>required
sessionViewAgentSessionViewrequired
Show child attributes
gitStateAgentGitStaterequired
Show child attributes
branchDiffstringrequired
commitLogstringrequired
hasAgentCommitsbooleanrequired
headCommitstringrequired
sessionAgentSessionrequired
Show child attributes
activeTurnIdstring
agentBranchstringrequired
agentCurrentProjectIdinteger[-9223372036854776000, 9223372036854776000]
baseCommitstringrequired
createdAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
lastErrorstring
preparedApplyPreparedApply
Show child attributes
agentHeadstringrequired
candidateHeadstringrequired
candidateWorktreestringrequired
targetHeadstringrequired
sessionIdstringrequired
sessionNamestring
statusstringrequired
targetBranchstringrequired
updatedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
worktreePathstringrequired
turnsArray<AgentTurn>required
Show child attributes
turnExitCodeinteger[-9223372036854776000, 9223372036854776000]
turnFinishedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>
turnIdstringrequired
turnLogstringrequired
turnLogPathstringrequired
turnPromptstringrequired
turnSessionIdstringrequired
turnStartedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
turnStatusstringrequired
Example
{
  "invalidatedProjectIds": [
    -9223372036854776000
  ],
  "invalidatedStepIds": [
    -9223372036854776000
  ],
  "sessionView": {
    "gitState": {
      "branchDiff": "string",
      "commitLog": "string",
      "hasAgentCommits": true,
      "headCommit": "string"
    },
    "session": {
      "activeTurnId": "string",
      "agentBranch": "string",
      "agentCurrentProjectId": -9223372036854776000,
      "baseCommit": "string",
      "createdAt": "2016-07-22T00:00:00Z",
      "lastError": "string",
      "preparedApply": {
        "agentHead": "string",
        "candidateHead": "string",
        "candidateWorktree": "string",
        "targetHead": "string"
      },
      "sessionId": "string",
      "sessionName": "string",
      "status": "string",
      "targetBranch": "string",
      "updatedAt": "2016-07-22T00:00:00Z",
      "worktreePath": "string"
    },
    "turns": [
      {
        "turnExitCode": -9223372036854776000,
        "turnFinishedAt": "2016-07-22T00:00:00Z",
        "turnId": "string",
        "turnLog": "string",
        "turnLogPath": "string",
        "turnPrompt": "string",
        "turnSessionId": "string",
        "turnStartedAt": "2016-07-22T00:00:00Z",
        "turnStatus": "string"
      }
    ]
  }
}

AgentGitState

object
branchDiffstringrequired
commitLogstringrequired
hasAgentCommitsbooleanrequired
headCommitstringrequired
Example
{
  "branchDiff": "string",
  "commitLog": "string",
  "hasAgentCommits": true,
  "headCommit": "string"
}

AgentSession

object
activeTurnIdstring
agentBranchstringrequired
agentCurrentProjectIdinteger[-9223372036854776000, 9223372036854776000]
baseCommitstringrequired
createdAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
lastErrorstring
preparedApplyPreparedApply
Show child attributes
agentHeadstringrequired
candidateHeadstringrequired
candidateWorktreestringrequired
targetHeadstringrequired
sessionIdstringrequired
sessionNamestring
statusstringrequired
targetBranchstringrequired
updatedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
worktreePathstringrequired
Example
{
  "activeTurnId": "string",
  "agentBranch": "string",
  "agentCurrentProjectId": -9223372036854776000,
  "baseCommit": "string",
  "createdAt": "2016-07-22T00:00:00Z",
  "lastError": "string",
  "preparedApply": {
    "agentHead": "string",
    "candidateHead": "string",
    "candidateWorktree": "string",
    "targetHead": "string"
  },
  "sessionId": "string",
  "sessionName": "string",
  "status": "string",
  "targetBranch": "string",
  "updatedAt": "2016-07-22T00:00:00Z",
  "worktreePath": "string"
}

AgentSessionSummary

object
hasCommitsbooleanrequired
sessionAgentSessionrequired
Show child attributes
activeTurnIdstring
agentBranchstringrequired
agentCurrentProjectIdinteger[-9223372036854776000, 9223372036854776000]
baseCommitstringrequired
createdAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
lastErrorstring
preparedApplyPreparedApply
Show child attributes
agentHeadstringrequired
candidateHeadstringrequired
candidateWorktreestringrequired
targetHeadstringrequired
sessionIdstringrequired
sessionNamestring
statusstringrequired
targetBranchstringrequired
updatedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
worktreePathstringrequired
titlestringrequired
turnCountinteger[-9223372036854776000, 9223372036854776000]required
Example
{
  "hasCommits": true,
  "session": {
    "activeTurnId": "string",
    "agentBranch": "string",
    "agentCurrentProjectId": -9223372036854776000,
    "baseCommit": "string",
    "createdAt": "2016-07-22T00:00:00Z",
    "lastError": "string",
    "preparedApply": {
      "agentHead": "string",
      "candidateHead": "string",
      "candidateWorktree": "string",
      "targetHead": "string"
    },
    "sessionId": "string",
    "sessionName": "string",
    "status": "string",
    "targetBranch": "string",
    "updatedAt": "2016-07-22T00:00:00Z",
    "worktreePath": "string"
  },
  "title": "string",
  "turnCount": -9223372036854776000
}

AgentSessionView

object
gitStateAgentGitStaterequired
Show child attributes
branchDiffstringrequired
commitLogstringrequired
hasAgentCommitsbooleanrequired
headCommitstringrequired
sessionAgentSessionrequired
Show child attributes
activeTurnIdstring
agentBranchstringrequired
agentCurrentProjectIdinteger[-9223372036854776000, 9223372036854776000]
baseCommitstringrequired
createdAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
lastErrorstring
preparedApplyPreparedApply
Show child attributes
agentHeadstringrequired
candidateHeadstringrequired
candidateWorktreestringrequired
targetHeadstringrequired
sessionIdstringrequired
sessionNamestring
statusstringrequired
targetBranchstringrequired
updatedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
worktreePathstringrequired
turnsArray<AgentTurn>required
Show child attributes
turnExitCodeinteger[-9223372036854776000, 9223372036854776000]
turnFinishedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>
turnIdstringrequired
turnLogstringrequired
turnLogPathstringrequired
turnPromptstringrequired
turnSessionIdstringrequired
turnStartedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
turnStatusstringrequired
Example
{
  "gitState": {
    "branchDiff": "string",
    "commitLog": "string",
    "hasAgentCommits": true,
    "headCommit": "string"
  },
  "session": {
    "activeTurnId": "string",
    "agentBranch": "string",
    "agentCurrentProjectId": -9223372036854776000,
    "baseCommit": "string",
    "createdAt": "2016-07-22T00:00:00Z",
    "lastError": "string",
    "preparedApply": {
      "agentHead": "string",
      "candidateHead": "string",
      "candidateWorktree": "string",
      "targetHead": "string"
    },
    "sessionId": "string",
    "sessionName": "string",
    "status": "string",
    "targetBranch": "string",
    "updatedAt": "2016-07-22T00:00:00Z",
    "worktreePath": "string"
  },
  "turns": [
    {
      "turnExitCode": -9223372036854776000,
      "turnFinishedAt": "2016-07-22T00:00:00Z",
      "turnId": "string",
      "turnLog": "string",
      "turnLogPath": "string",
      "turnPrompt": "string",
      "turnSessionId": "string",
      "turnStartedAt": "2016-07-22T00:00:00Z",
      "turnStatus": "string"
    }
  ]
}

AgentTurn

object
turnExitCodeinteger[-9223372036854776000, 9223372036854776000]
turnFinishedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>
turnIdstringrequired
turnLogstringrequired
turnLogPathstringrequired
turnPromptstringrequired
turnSessionIdstringrequired
turnStartedAtUTCTime<yyyy-mm-ddThh:MM:ssZ>required
turnStatusstringrequired
Example
{
  "turnExitCode": -9223372036854776000,
  "turnFinishedAt": "2016-07-22T00:00:00Z",
  "turnId": "string",
  "turnLog": "string",
  "turnLogPath": "string",
  "turnPrompt": "string",
  "turnSessionId": "string",
  "turnStartedAt": "2016-07-22T00:00:00Z",
  "turnStatus": "string"
}

AgentUsage

object
appliedSessionsinteger[-9223372036854776000, 9223372036854776000]required
discardedSessionsinteger[-9223372036854776000, 9223372036854776000]required
openSessionsinteger[-9223372036854776000, 9223372036854776000]required
runningSessionsinteger[-9223372036854776000, 9223372036854776000]required
totalSessionsinteger[-9223372036854776000, 9223372036854776000]required
Example
{
  "appliedSessions": -9223372036854776000,
  "discardedSessions": -9223372036854776000,
  "openSessions": -9223372036854776000,
  "runningSessions": -9223372036854776000,
  "totalSessions": -9223372036854776000
}

AutocompleteRequest

object
autocompletestringrequired
contextobjectrequired
limitinteger[-9223372036854776000, 9223372036854776000]
querystringrequired
templatestringrequired
Example
{
  "autocomplete": "string",
  "context": {},
  "limit": -9223372036854776000,
  "query": "string",
  "template": "string"
}

ChildRef

object

A step or project child of a project.

One of
stepobjectrequired
Show child attributes
idintegerrequired
projectobjectrequired
Show child attributes
idintegerrequired
Example
{
  "step": {
    "id": 0
  }
}

ConfirmApplyRequest

object
candidateHeadstringrequired
sessionIdstringrequired
targetHeadstringrequired
Example
{
  "candidateHead": "string",
  "sessionId": "string",
  "targetHead": "string"
}

DirEntry

object
isDirbooleanrequired
mimeTypestring
namestringrequired
seekablebooleanrequired
sizeintegerrequired
viewablebooleanrequired
Example
{
  "isDir": true,
  "mimeType": "string",
  "name": "string",
  "seekable": true,
  "size": 0,
  "viewable": true
}

DynamicJson

object
DynamicJson
Example
{}

FileChunk

object
contentstringrequired
endLineinteger[-9223372036854776000, 9223372036854776000]required
endOffsetinteger[-9223372036854776000, 9223372036854776000]required
eofbooleanrequired
startLineinteger[-9223372036854776000, 9223372036854776000]required
startOffsetinteger[-9223372036854776000, 9223372036854776000]required
Example
{
  "content": "string",
  "endLine": -9223372036854776000,
  "endOffset": -9223372036854776000,
  "eof": true,
  "startLine": -9223372036854776000,
  "startOffset": -9223372036854776000
}

FileDownload

string
FileDownload<binary>
Example
"<binary>"

PreparedApply

object
agentHeadstringrequired
candidateHeadstringrequired
candidateWorktreestringrequired
targetHeadstringrequired
Example
{
  "agentHead": "string",
  "candidateHead": "string",
  "candidateWorktree": "string",
  "targetHead": "string"
}

ProjectFields

object

A project's name and exactly one of preset or templates.

namestringrequired
presetstring
templatesArray<string>
Example
{
  "name": "string",
  "preset": "string",
  "templates": [
    "string"
  ]
}

RenameSessionRequest

object
namestringrequired
sessionIdstringrequired
Example
{
  "name": "string",
  "sessionId": "string"
}

ReviewRequest

object
reviewCommentsstringrequired
reviewedBystringrequired
Example
{
  "reviewComments": "string",
  "reviewedBy": "string"
}

ScratchEntry

object
directorybooleanrequired
namestringrequired
sizeinteger | nullrequired
Example
{
  "directory": true,
  "name": "string",
  "size": 0
}

ScratchListing

object
entriesArray<ScratchEntry>required
Show child attributes
directorybooleanrequired
namestringrequired
sizeinteger | nullrequired
pathstringrequired
Example
{
  "entries": [
    {
      "directory": true,
      "name": "string",
      "size": 0
    }
  ],
  "path": "string"
}

ScratchRootResponse

object
rootstring | nullrequired
Example
{
  "root": "string"
}

ScratchWrapRequest

object
pathstringrequired
Example
{
  "path": "string"
}

SessionRequest

object
sessionIdstringrequired
Example
{
  "sessionId": "string"
}

StepReviewReport

object
comparisonstringrequired
comparisonDetailstringrequired
reviewCommentsstringrequired
reviewedBystringrequired
reviewedRevisionstringrequired
reviewedStatusstringrequired
reviewedStatusErrorstringrequired
Example
{
  "comparison": "string",
  "comparisonDetail": "string",
  "reviewComments": "string",
  "reviewedBy": "string",
  "reviewedRevision": "string",
  "reviewedStatus": "string",
  "reviewedStatusError": "string"
}

StreamingBody

string

Streaming response body.

StreamingBody<binary>
Example
"<binary>"

TreeOp

object

One project tree operation: update {project,fields}; link or unlink {parent,child}; order {parent,children}; hide {parent,child,hidden}; delete {child}.

childobject | object

A step or project child of a project.

childrenArray<ChildRef>
Show child attributes

A step or project child of a project.

One of
stepobjectrequired
Show child attributes
idintegerrequired
projectobjectrequired
Show child attributes
idintegerrequired
fieldsProjectFields

A project's name and exactly one of preset or templates.

Show child attributes
namestringrequired
presetstring
templatesArray<string>
hiddenboolean
opstringrequired

One of update, link, unlink, order, hide, delete.

parentinteger
projectinteger
Example
{
  "child": {
    "step": {
      "id": 0
    }
  },
  "children": [
    {
      "step": {
        "id": 0
      }
    }
  ],
  "fields": {
    "name": "string",
    "preset": "string",
    "templates": [
      "string"
    ]
  },
  "hidden": true,
  "op": "string",
  "parent": 0,
  "project": 0
}

TurnRequest

object
currentProjectIdinteger | null
promptstringrequired
sessionIdstringrequired
Example
{
  "currentProjectId": 0,
  "prompt": "string",
  "sessionId": "string"
}

UTCTime

string
UTCTime<yyyy-mm-ddThh:MM:ssZ>
Example
"2016-07-22T00:00:00Z"

UserRepoInfo

object
branchstringrequired
urlstringrequired
Example
{
  "branch": "string",
  "url": "string"
}