feat: service exec console

POST /services/:id/exec runs a one-off sh -c command inside the
service's container via ExecRun (30s ceiling, 64KB output cap), with
the standard service→project ownership check. Console section on the
service detail page submits commands and renders captured output with
exit codes.

Verified live: real exec output, stderr + exit code propagation, 404 on
foreign service, 401 unauthenticated, 400 on empty command.

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Tomas DvorakandDevin committed 2026-09-17 18:34:58 +02:00
1 parent 6d237eccf7
commit f357c7adee
7 files changed
+317 -4

No files matched your search

+81
View File
@@ -809,6 +809,87 @@ export interface paths {
patch?: never;
trace?: never;
};
"/services/{id}/exec": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
/**
* Execute command in service container
* @description Runs a one-off shell command via docker exec and returns captured output. 30s ceiling, 64KB output cap. For debugging only.
*/
post: {
parameters: {
query?: never;
header?: never;
path: {
/** @description Service ID */
id: string;
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
/** @description Shell command (executed via sh -c) */
command: string;
};
};
};
responses: {
/** @description Command executed (check exit_code/error for failure) */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": {
output?: string;
exit_code?: number;
error?: string;
};
};
};
/** @description Invalid request */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Service not found */
404: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description No running container for this service */
409: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Docker unavailable */
503: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/deployments/{id}/logs": {
parameters: {
query?: never;