Remove the retry, rewind, fork and timeline endpoints and commands

The legacy executor replayed a run from a checkpoint; Petri resumes a
run from its records instead, and the checkpoint timeline, rewind, fork
and retry were the operations that replay carried. The server dropped
their handlers with the executor; this removes the rest:

- the API spec's `/runs/{id}/retry`, `/rewind`, `/fork` and `/timeline`
  paths with the `ForkRequest`, `ForkResponse`, `RewindRequest`,
  `RewindResponse` and `TimelineEntryResponse` schemas, and the
  generated TypeScript models;
- `fabro rewind` and `fabro fork` (with the checkpoint timeline printer
  and the repo-origin check only they used), their reference pages and
  the checkpoints guide's rewind and fork sections;
- `fabro-client`'s `rewind_run`, `fork_run` and `run_timeline`;
- the web app's Retry action on the run list and the run page.

`Run.retried_from` stays on the run type: a run that was retried before
the cutover would still name its source.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Bryan Helmkamp 2026-09-18 10:54:45 -04:00
parent 3e157d3356
commit e8e681adbf
No known key found for this signature in database
22 changed files with 21 additions and 997 deletions

View file

@ -20,7 +20,6 @@ import {
denyRun,
isCancellationPendingState,
mapError,
retryRun,
unarchiveRun,
} from "../../lib/run-actions";
import type { LifecycleAction } from "../../lib/run-actions";
@ -44,7 +43,6 @@ export function RowActionsMenu({ run }: { run: RunWithStatus }) {
const status = run.lifecycleStatus;
const showApprove = run.pendingApproval === true;
const showDeny = run.pendingApproval === true;
const showRetry = status === "failed" || status === "dead";
const showArchive = canArchive(status);
const showUnarchive = canUnarchive(status);
const showCancel = canCancel(status);
@ -56,7 +54,7 @@ export function RowActionsMenu({ run }: { run: RunWithStatus }) {
);
const pending = pendingAction !== null || cancellationPending;
const hasLifecycle = showRetry || showArchive || showUnarchive;
const hasLifecycle = showArchive || showUnarchive;
const hasDestructive = showDeny || showCancel || showDelete;
async function runAction<T>(
@ -162,20 +160,6 @@ export function RowActionsMenu({ run }: { run: RunWithStatus }) {
</button>
</MenuItem>
)}
{showRetry && (
<MenuItem>
<button
type="button"
onClick={() =>
void runAction("retry", () => retryRun(run.id), "Retried run.")
}
disabled={pending}
className={MENU_ITEM_CLASS}
>
Retry
</button>
</MenuItem>
)}
{showArchive && (
<MenuItem>
<button

View file

@ -23,7 +23,6 @@ import {
cancelRun,
denyRun,
isLifecycleActionError,
retryRun,
unarchiveRun,
} from "./run-actions";
@ -82,15 +81,6 @@ export function useUnarchiveRun(id: string | undefined) {
return useLifecycleMutation(id, "unarchive", unarchiveRun);
}
export function useRetryRun(id: string | undefined) {
return useLifecycleMutation(id, "retry", retryRun, (run, mutate) => {
void mutate(queryKeys.runs.detail(run.id), run, { revalidate: false });
if (run.parent_id) {
mutateRunListCaches(mutate);
}
});
}
function useLifecycleMutation(
id: string | undefined,
intent: LifecycleAction,
@ -118,12 +108,10 @@ function useLifecycleMutation(
{
onSuccess: (result) => {
if (!id || !result.ok) return;
if (intent !== "retry") {
// Keep the returned lifecycle state visible while revalidation
// observes the durable follow-up event (notably a 202 cancel).
void mutate(queryKeys.runs.detail(id), result.run, { revalidate: true });
void mutate(queryKeys.runs.usage(id));
}
// Keep the returned lifecycle state visible while revalidation
// observes the durable follow-up event (notably a 202 cancel).
void mutate(queryKeys.runs.detail(id), result.run, { revalidate: true });
void mutate(queryKeys.runs.usage(id));
mutateRunListCaches(mutate);
onSuccessExtra?.(result.run, mutate);
},

View file

@ -81,7 +81,6 @@ export const queryKeys = {
cancel: (id: string) => ["runs", "cancel", id] as const,
approve: (id: string) => ["runs", "approve", id] as const,
deny: (id: string) => ["runs", "deny", id] as const,
retry: (id: string) => ["runs", "retry", id] as const,
archive: (id: string) => ["runs", "archive", id] as const,
unarchive: (id: string) => ["runs", "unarchive", id] as const,
updateTitle: (id: string) => ["runs", "update-title", id] as const,

View file

@ -13,7 +13,6 @@ import {
canArchive,
canApprove,
canCancel,
canRetry,
canUnarchive,
cancellationActionLabel,
cancellationSuccessMessage,
@ -24,7 +23,6 @@ import {
isCancellationPending,
isCancellationPendingState,
mapError,
retryRun,
unarchiveRun,
unarchiveRuns,
} from "./run-actions";
@ -350,22 +348,6 @@ describe("run lifecycle actions", () => {
});
});
test("retryRun parses a 201 response", async () => {
stubGeneratedAxiosOnce({
status: 201,
body: {
...makeRun({ kind: "submitted" }),
id: "run-2",
retried_from: "run-1",
},
});
const result = await retryRun("run-1");
expect(result.id).toBe("run-2");
expect(result.retried_from).toBe("run-1");
expect(result.lifecycle.status.kind).toBe("submitted");
});
test("404 and 409 preserve the parsed error envelope", async () => {
stubGeneratedAxiosOnce({
status: 404,
@ -449,16 +431,6 @@ describe("run lifecycle actions", () => {
expect(canApprove(makeRun({ kind: "runnable" }))).toBe(false);
});
test("canRetry allows terminal runs except archived runs", () => {
expect(canRetry(makeRun({ kind: "failed", reason: "workflow_error" }))).toBe(true);
expect(canRetry(makeRun({ kind: "dead" }))).toBe(true);
expect(canRetry(makeRun({ kind: "failed", reason: "cancelled" }))).toBe(true);
expect(canRetry(makeRun({ kind: "succeeded", reason: "completed" }))).toBe(true);
expect(canRetry(makeRun({ kind: "running" }))).toBe(false);
expect(canRetry(makeRun({ kind: "failed", reason: "workflow_error" }, true))).toBe(false);
expect(canRetry(makeRun({ kind: "succeeded", reason: "completed" }, true))).toBe(false);
});
test("isTerminalCancelledRun distinguishes immediate cancel success from in-flight cancellation", () => {
expect(
isTerminalCancelledRun(makeRun({ kind: "failed", reason: "cancelled" })),

View file

@ -23,8 +23,7 @@ export type LifecycleAction =
| "approve"
| "deny"
| "archive"
| "unarchive"
| "retry";
| "unarchive";
export interface LifecycleActionError {
status: number;
@ -118,10 +117,6 @@ export async function deleteRuns(
}
}
export async function retryRun(id: string, request?: Request): Promise<Run> {
return runLifecycleAction(id, "retry", request);
}
export async function deleteRun(id: string, request?: Request): Promise<void> {
try {
await apiResponse(() => runsApi.deleteRun(id, undefined, requestSignalOptions(request)));
@ -147,11 +142,6 @@ export function canUnarchive(status: string | null | undefined): boolean {
return status === "archived";
}
export function canRetry(run: Pick<Run, "lifecycle"> | null | undefined): boolean {
if (!run || run.lifecycle.archived) return false;
return isTerminalRunStatus(run.lifecycle.status.kind);
}
export function isTerminalRunStatus(
status: string | null | undefined,
): boolean {
@ -223,8 +213,6 @@ export function mapError(error: unknown, action: LifecycleAction): string {
return "Only terminal runs can be archived.";
case "unarchive":
return "Active runs can't be unarchived.";
case "retry":
return "This run can no longer be retried.";
}
}
@ -245,8 +233,6 @@ export function mapError(error: unknown, action: LifecycleAction): string {
return "Couldn't archive the run right now. Try again.";
case "unarchive":
return "Couldn't unarchive the run right now. Try again.";
case "retry":
return "Couldn't retry the run right now. Try again.";
}
}
@ -267,8 +253,6 @@ async function runLifecycleAction(
return await apiData(() => runsApi.archiveRun(id, requestSignalOptions(request)));
case "unarchive":
return await apiData(() => runsApi.unarchiveRun(id, requestSignalOptions(request)));
case "retry":
return await apiData(() => runsApi.retryRun(id, requestSignalOptions(request)));
}
} catch (error) {
throw lifecycleActionErrorFromError(error);

View file

@ -167,7 +167,6 @@ mock.module("../lib/mutations", () => ({
useDenyRun: mutationState,
useInterruptRun: mutationState,
usePreviewRun: mutationState,
useRetryRun: mutationState,
useSteerRun: mutationState,
useSubmitInterviewAnswer: mutationState,
useUpdateRunTitle: mutationState,
@ -535,7 +534,6 @@ describe("handleLifecycleToastResult", () => {
deny: null,
archive: null,
unarchive: null,
retry: null,
},
};
@ -608,7 +606,6 @@ describe("handleLifecycleToastResult", () => {
deny: null,
archive: null,
unarchive: null,
retry: null,
},
};
@ -678,63 +675,6 @@ describe("RunDetail full-height child routes", () => {
expect(badges.map((badge) => badge.children.join(""))).toContain("7");
});
test("successful retry result navigates to the new run once", () => {
const pushed: Array<{ message: string; tone?: string }> = [];
const navigated: string[] = [];
const result: RunDetailActionResult = {
intent: "retry",
ok: true,
run: {
...makeRunSummary({ status: "runnable" }),
id: "run_retry",
retried_from: "run_1",
},
};
const initialState: LifecycleToastState = {
activeArchiveToastId: null,
lastProcessed: {
cancel: null,
approve: null,
deny: null,
archive: null,
unarchive: null,
retry: null,
},
};
const next = handleLifecycleToastResult(
"retry",
result,
initialState,
{
push: (toast) => {
pushed.push(toast);
return "toast-1";
},
dismiss: () => undefined,
},
(path) => navigated.push(path),
);
const replay = handleLifecycleToastResult(
"retry",
result,
next,
{
push: (toast) => {
pushed.push(toast);
return "toast-2";
},
dismiss: () => undefined,
},
(path) => navigated.push(path),
);
expect(next.lastProcessed.retry).toBe(result);
expect(replay).toBe(next);
expect(pushed).toEqual([{ message: "Retry started." }]);
expect(navigated).toEqual(["/runs/run_retry"]);
});
test("hides the Sandbox tab for a planned sandbox without an instance", async () => {
currentRunState = {
sandbox: {

View file

@ -28,7 +28,6 @@ import {
useDenyRun,
useInterruptRun,
usePreviewRun,
useRetryRun,
useUnarchiveRun,
type LifecycleMutationResult,
} from "../lib/mutations";
@ -37,7 +36,6 @@ import { useRunToasts } from "../hooks/use-run-toasts";
import { useRun, useRunQuestions, useRunState } from "../lib/queries";
import {
canApprove,
canRetry,
deleteErrorMessage,
deleteRun,
isCancellationPending,
@ -113,7 +111,6 @@ export default function RunDetail({ params }: { params: { id: string } }) {
const denyMutation = useDenyRun(params.id);
const archiveMutation = useArchiveRun(params.id);
const unarchiveMutation = useUnarchiveRun(params.id);
const retryMutation = useRetryRun(params.id);
const interruptMutation = useInterruptRun(params.id);
const navigate = useNavigate();
const { mutate } = useSWRConfig();
@ -160,10 +157,9 @@ export default function RunDetail({ params }: { params: { id: string } }) {
result,
lifecycleToastStateRef,
{ push, dismiss },
intent === "retry" ? navigate : undefined,
);
},
[dismiss, navigate, push],
[dismiss, push],
);
const triggerLifecycleAction = useCallback(
async (intent: LifecycleAction, trigger: LifecycleTrigger) => {
@ -205,7 +201,6 @@ export default function RunDetail({ params }: { params: { id: string } }) {
const denyPending = denyMutation.isMutating;
const archivePending = archiveMutation.isMutating;
const unarchivePending = unarchiveMutation.isMutating;
const retryPending = retryMutation.isMutating;
const handlePreview = async () => {
const previewWindow = window.open("about:blank", "_blank");
try {
@ -284,15 +279,6 @@ export default function RunDetail({ params }: { params: { id: string } }) {
},
],
lifecycle: [
...(!demoMode && canRetry(summary)
? [{
key: "retry",
label: "Retry",
pendingLabel: "Retrying…",
pending: retryPending,
onSelect: () => void triggerLifecycleAction("retry", retryMutation.trigger),
}]
: []),
...(visibility.showArchive
? [{
key: "archive",

View file

@ -34,7 +34,6 @@ export function createLifecycleToastState(): LifecycleToastState {
deny: null,
archive: null,
unarchive: null,
retry: null,
},
};
}
@ -44,14 +43,12 @@ export function updateLifecycleToastState(
result: RunDetailActionResult | undefined,
stateRef: { current: LifecycleToastState },
toastApi: ToastApi,
navigate?: (path: string) => void,
) {
stateRef.current = handleLifecycleToastResult(
intent,
result,
stateRef.current,
toastApi,
navigate,
);
}
@ -75,7 +72,6 @@ export function handleLifecycleToastResult(
result: RunDetailActionResult | undefined,
state: LifecycleToastState,
toastApi: ToastApi,
navigate?: (path: string) => void,
): LifecycleToastState {
if (!result || result.intent !== intent) return state;
if (state.lastProcessed[intent] === result) return state;
@ -107,12 +103,6 @@ export function handleLifecycleToastResult(
return nextState;
}
if (intent === "retry") {
toastApi.push({ message: "Retry started." });
navigate?.(`/runs/${result.run.id}`);
return nextState;
}
if (state.activeArchiveToastId) {
toastApi.dismiss(state.activeArchiveToastId);
}

View file

@ -2181,44 +2181,6 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/api/v1/runs/{id}/retry:
post:
operationId: retryRun
tags: [Runs]
summary: Retry Run
description: >
Creates a fresh run from the terminal source run's captured
durable definition, records `retried_from` on the new run, and schedules
it for execution. The source run is left unchanged. Active and archived
runs are not retryable.
parameters:
- $ref: "#/components/parameters/RunId"
responses:
"201":
description: New retry run created and scheduled for execution
content:
application/json:
schema:
$ref: "#/components/schemas/Run"
"404":
description: Run not found
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"409":
description: Source run is not retryable
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
/api/v1/runs/{id}/pause:
post:
operationId: pauseRun
@ -2325,172 +2287,6 @@ paths:
schema:
$ref: "#/components/schemas/ErrorResponse"
/api/v1/runs/{id}/rewind:
post:
operationId: rewindRun
tags: [Runs]
summary: Rewind Run
description: >
Creates a new run from an earlier checkpoint of a terminal source run,
archives the source run, and records `run.superseded_by` on the source
after archive succeeds. Returns 207 when the new run was created but
the source archive step failed.
parameters:
- $ref: "#/components/parameters/RunId"
requestBody:
required: false
content:
application/json:
schema:
$ref: "#/components/schemas/RewindRequest"
responses:
"200":
description: Source archived and new run created
content:
application/json:
schema:
$ref: "#/components/schemas/RewindResponse"
"207":
description: New run created but source archive failed
content:
application/json:
schema:
$ref: "#/components/schemas/RewindResponse"
"400":
description: Invalid rewind target
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"404":
description: Run not found
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"409":
description: Source run is archived or is not terminal
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"501":
description: Operation unsupported for this run
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
/api/v1/runs/{id}/fork:
post:
operationId: forkRun
tags: [Runs]
summary: Fork Run
description: >
Creates a new run from a checkpoint of the source run. The source run
is left untouched.
parameters:
- $ref: "#/components/parameters/RunId"
requestBody:
required: false
content:
application/json:
schema:
$ref: "#/components/schemas/ForkRequest"
responses:
"200":
description: New run created
content:
application/json:
schema:
$ref: "#/components/schemas/ForkResponse"
"400":
description: Invalid fork target
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"404":
description: Run not found
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"409":
description: Source run is archived
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"501":
description: Operation unsupported for this run
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
/api/v1/runs/{id}/timeline:
get:
operationId: getRunTimeline
tags: [Runs]
summary: Get Run Timeline
description: >
Returns checkpoint timeline entries from durable run-store checkpoints.
Metadata branches are write-only archives and are not read by this endpoint.
parameters:
- $ref: "#/components/parameters/RunId"
responses:
"200":
description: Run checkpoint timeline
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/TimelineEntryResponse"
"404":
description: Run not found
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
"501":
description: Operation unsupported for this run
headers:
x-request-id:
$ref: "#/components/headers/XRequestId"
content:
application/json:
schema:
$ref: "#/components/schemas/ErrorResponse"
/api/v1/runs/{id}/unarchive:
post:
operationId: unarchiveRun
@ -13535,82 +13331,6 @@ components:
type: ["string", "null"]
format: uri
ForkRequest:
description: Request body for creating a new run from a source run checkpoint.
type: object
properties:
target:
type: ["string", "null"]
description: Optional checkpoint target such as `@2`, `build`, or `build@1`. Defaults to the latest checkpoint.
ForkResponse:
description: Response returned after creating a forked run.
type: object
required:
- source_run_id
- new_run_id
- target
properties:
source_run_id:
type: string
new_run_id:
type: string
target:
type: string
RewindRequest:
description: Request body for creating a replacement run from a source run checkpoint.
type: object
properties:
target:
type: ["string", "null"]
description: Optional checkpoint target such as `@2`, `build`, or `build@1`. Defaults to the latest checkpoint.
RewindResponse:
description: Response returned after rewind creates a new run.
type: object
required:
- source_run_id
- new_run_id
- target
- archived
properties:
source_run_id:
type: string
new_run_id:
type: string
target:
type: string
archived:
type: boolean
archive_error:
type: ["string", "null"]
TimelineEntryResponse:
description: Checkpoint timeline entry for a run.
type: object
required:
- ordinal
- node_name
- visit
- checkpoint_seq
properties:
ordinal:
type: integer
minimum: 1
node_name:
type: string
visit:
type: integer
minimum: 1
checkpoint_seq:
type: integer
minimum: 1
run_commit_sha:
type: ["string", "null"]
# ── Run Board Schemas ────────────────────────────────────────────────
BoardColumn:
description: |
Status bucket for a run, shared by list and kanban renderings and by

View file

@ -147,46 +147,6 @@ fabro events 01JKXYZ
fabro dump 01JKXYZ --output ./run-dump
```
## Rewinding to an earlier checkpoint
If a later stage goes off-track, you can rewind a terminal run to an earlier checkpoint and resume from there instead of restarting the entire workflow. Rewind creates a replacement run at the target checkpoint, archives the source run, and prints the new run ID to resume:
```bash
# List the checkpoint timeline
fabro rewind <RUN_ID> --list
# Rewind to a specific checkpoint
fabro rewind <RUN_ID> plan@2
# Resume from the rewound point
fabro resume <NEW_RUN_ID>
```
The source run must already be terminal (`succeeded`, `failed`, or `dead`). If the source is archived, unarchive it first. If archive fails after the replacement run is created, do not retry `fabro rewind`; archive the source run manually.
See [`fabro rewind`](/reference/cli#fabro-rewind) for the full command reference.
## Forking a run
If you want to explore an alternate path from a checkpoint without archiving the original run, use `fabro fork` instead of `fabro rewind`. Fork creates a new independent run branching from the target checkpoint; the original run stays intact.
```bash
# List checkpoints
fabro fork <RUN_ID> --list
# Fork from a specific checkpoint
fabro fork <RUN_ID> plan@2
# Resume the forked run
fabro resume <NEW_RUN_ID>
```
Use **rewind** when a terminal run should be abandoned and replaced from an earlier point. Use **fork** when you want to try a different approach while keeping the original run as a reference.
`fabro rewind --list`, `fabro fork --list`, `fabro rewind`, and `fabro fork` are server-backed. Timeline listing reads checkpoints from the durable run store.
See [`fabro fork`](/reference/cli#fabro-fork) for the full command reference.
## When checkpointing is active
Git checkpointing activates automatically when:

View file

@ -77,7 +77,6 @@ fabro [OPTIONS] [COMMAND]
| `fabro doctor` | Check environment and integration health |
| `fabro dump` | Export a run's durable state to a directory |
| `fabro events` | View the event log of a workflow run |
| `fabro fork` | Fork a workflow run from an earlier checkpoint into a new run |
| `fabro graph` | Render a workflow graph as SVG |
| `fabro inspect` | Show detailed information about a workflow run |
| `fabro install` | Set up the Fabro environment (LLMs, certs, GitHub) |
@ -90,7 +89,6 @@ fabro [OPTIONS] [COMMAND]
| `fabro provider` | Provider operations |
| `fabro repo` | Repository commands |
| `fabro resume` | Resume an interrupted workflow run |
| `fabro rewind` | Rewind a workflow run to an earlier checkpoint |
| `fabro rm` | Remove one or more workflow runs |
| `fabro run` | Register a workflow version, create a run, and start it |
| `fabro sandbox` | Sandbox operations (cp, ssh, preview) |
@ -466,28 +464,6 @@ fabro events [OPTIONS] <RUN>
| `--since <since>` | Events since timestamp or relative (e.g. "42m", "2h", "2026-01-02T13:00:00Z") |
| `-n, --tail <tail>` | Lines from end (default: all) |
### `fabro fork`
Fork a workflow run from an earlier checkpoint into a new run
```bash
fabro fork [OPTIONS] <RUN_ID> [TARGET]
```
#### Arguments
| Name | Description |
| --- | --- |
| `RUN_ID` | Run ID (or unambiguous prefix) |
| `TARGET` | Target checkpoint: node name, node@visit, or @ordinal (omit to fork from latest) |
#### Options
| Option | Description |
| --- | --- |
| `--list` | Show the checkpoint timeline instead of forking |
| `--server <server>` | Fabro server target: http(s) URL or absolute Unix socket path |
### `fabro graph`
Render a workflow graph as SVG
@ -1022,28 +998,6 @@ fabro resume [OPTIONS] <RUN>
| `-d, --detach` | Run in the background and print the run ID |
| `--server <server>` | Fabro server target: http(s) URL or absolute Unix socket path |
### `fabro rewind`
Rewind a workflow run to an earlier checkpoint
```bash
fabro rewind [OPTIONS] <RUN_ID> [TARGET]
```
#### Arguments
| Name | Description |
| --- | --- |
| `RUN_ID` | Run ID (or unambiguous prefix) |
| `TARGET` | Target checkpoint: node name, node@visit, or @ordinal (omit with --list) |
#### Options
| Option | Description |
| --- | --- |
| `--list` | Show the checkpoint timeline instead of rewinding |
| `--server <server>` | Fabro server target: http(s) URL or absolute Unix socket path |
### `fabro rm`
Remove one or more workflow runs

View file

@ -758,39 +758,6 @@ pub(crate) struct ResumeArgs {
pub(crate) detach: bool,
}
#[derive(Debug, Args)]
pub(crate) struct RewindArgs {
#[command(flatten)]
pub(crate) server: ServerTargetArgs,
/// Run ID (or unambiguous prefix)
pub(crate) run_id: String,
/// Target checkpoint: node name, node@visit, or @ordinal (omit with --list)
pub(crate) target: Option<String>,
/// Show the checkpoint timeline instead of rewinding
#[arg(long)]
pub(crate) list: bool,
}
#[derive(Debug, Args)]
pub(crate) struct ForkArgs {
#[command(flatten)]
pub(crate) server: ServerTargetArgs,
/// Run ID (or unambiguous prefix)
pub(crate) run_id: String,
/// Target checkpoint: node name, node@visit, or @ordinal (omit to fork from
/// latest)
pub(crate) target: Option<String>,
/// Show the checkpoint timeline instead of forking
#[arg(long)]
pub(crate) list: bool,
}
#[derive(Args)]
pub(crate) struct WaitArgs {
#[command(flatten)]
@ -1300,10 +1267,6 @@ pub(crate) enum RunCommands {
Logs(LogsArgs),
/// Resume an interrupted workflow run
Resume(ResumeArgs),
/// Rewind a workflow run to an earlier checkpoint
Rewind(RewindArgs),
/// Fork a workflow run from an earlier checkpoint into a new run
Fork(ForkArgs),
/// Block until a workflow run completes
Wait(WaitArgs),
/// Steer a running agent mid-execution
@ -1324,10 +1287,8 @@ impl RunCommands {
Self::Events(_) => "events",
Self::Logs(_) => "logs",
Self::Resume(_) => "resume",
Self::Rewind(_) => "rewind",
Self::Steer(_) => "steer",
Self::Ask(_) => "ask",
Self::Fork(_) => "fork",
Self::Wait(_) => "wait",
}
}

View file

@ -10,13 +10,11 @@ use crate::sleep_inhibitor;
pub(crate) mod ask;
pub(crate) mod attach;
pub(crate) mod checkpoints;
pub(crate) mod command;
pub(crate) mod cp;
pub(crate) mod create;
pub(crate) mod diff;
pub(crate) mod events;
pub(crate) mod fork;
pub(crate) mod logs;
pub(crate) mod output;
pub(crate) mod overrides;
@ -26,7 +24,6 @@ pub(crate) mod preview;
mod remote_workflow;
mod resolution;
pub(crate) mod resume;
pub(crate) mod rewind;
pub(crate) mod run_progress;
pub(crate) mod runner;
mod selection;
@ -139,14 +136,6 @@ pub(crate) async fn dispatch(
};
Box::pin(resume::resume_command(args, styles, base_ctx)).await
}
RunCommands::Rewind(args) => {
let styles = Styles::detect_stderr();
Box::pin(rewind::run(&args, &styles, base_ctx)).await
}
RunCommands::Fork(args) => {
let styles = Styles::detect_stderr();
Box::pin(fork::run(&args, &styles, base_ctx)).await
}
RunCommands::Wait(args) => {
let styles = Styles::detect_stderr();
wait::run(&args, &styles, base_ctx).await

View file

@ -1,5 +1,4 @@
pub(crate) mod provider_auth;
pub(crate) mod repo;
mod utilities;
pub(crate) use utilities::*;

View file

@ -19,8 +19,6 @@ fn help() {
events View the event log of a workflow run
logs View the raw worker tracing log of a workflow run
resume Resume an interrupted workflow run
rewind Rewind a workflow run to an earlier checkpoint
fork Fork a workflow run from an earlier checkpoint into a new run
wait Block until a workflow run completes
steer Steer a running agent mid-execution
ask Ask Fabro a read-only question about a run

View file

@ -16,7 +16,6 @@ mod dump;
mod events;
mod exec;
mod fabro;
mod fork;
mod graph;
mod inspect;
mod install;
@ -44,7 +43,6 @@ mod repo;
mod repo_deinit;
mod repo_init;
mod resume;
mod rewind;
mod rm;
mod run;
mod runner;

View file

@ -57,8 +57,7 @@ pub(crate) struct RunSetup {
}
pub(crate) struct SeededGitRunSetup {
pub(crate) run: RunSetup,
pub(crate) step_one_sha: String,
pub(crate) run: RunSetup,
}
pub(crate) struct ProjectFixture {
@ -882,13 +881,6 @@ pub(crate) fn run_state(run_dir: &Path) -> RunProjection {
))
}
pub(crate) fn run_state_by_id(context: &TestContext, run_id: &str) -> RunProjection {
block_on(get_server_json_for_storage(
&context.storage_dir,
&format!("/api/v1/runs/{run_id}/state"),
))
}
pub(crate) fn run_events(run_dir: &Path) -> Vec<EventEnvelope> {
let run_id = infer_run_id(run_dir);
let response: serde_json::Value = block_on(get_server_json(
@ -993,10 +985,7 @@ async fn seed_git_backed_changed_run(context: &TestContext) -> SeededGitRunSetup
)
.await;
SeededGitRunSetup {
run,
step_one_sha: step_one_sha.to_string(),
}
SeededGitRunSetup { run }
}
async fn seed_git_backed_noop_run(context: &TestContext) -> RunSetup {

View file

@ -31,22 +31,21 @@ pub use fabro_api::types::{
CreateCompletionRequest, CreateRunPullRequestRequest, CreateSecretRequest,
CreateVariableRequest, DeleteRunResponse, DeleteRunSandbox, DeleteSecretRequest,
DenyRunRequest, DiskUsageResponse, DiskUsageRunRow, DiskUsageSummaryRow, ErrorResponseEntry,
ForkRequest, ForkResponse, IntegrationConnectionKind, IntegrationConnectionState,
IntegrationConnectionStatus, IntegrationProvider, IntegrationStatus, LinkRunPullRequestRequest,
MergeRunPullRequestRequest, MergeRunPullRequestResponse, ModelReference, PaginatedEventList,
PaginatedRunList, PaginationMeta, PreflightResponse, PreviewUrlRequest, PreviewUrlResponse,
Provider, ProviderCredentialTestRequest, ProviderCredentialTestResponse, ProviderList,
PruneRunEntry, PruneRunsRequest, PruneRunsResponse, RenderWorkflowGraphDirection,
RenderWorkflowGraphRequest, RewindRequest, RewindResponse, Run, RunArtifactEntry,
RunArtifactListResponse, RunError, RunManifest, RunStage, RunUsage, RunUsageStage,
RunUsageTotals, SandboxDetails, SandboxFileEntry, SandboxFileListResponse, SandboxService,
SandboxServiceListResponse, SshAccessRequest, SshAccessResponse, StageHandler, StageState,
StartRunRequest, SubmitAnswerRequest, SystemCpuResourceScope, SystemCpuResources,
IntegrationConnectionKind, IntegrationConnectionState, IntegrationConnectionStatus,
IntegrationProvider, IntegrationStatus, LinkRunPullRequestRequest, MergeRunPullRequestRequest,
MergeRunPullRequestResponse, ModelReference, PaginatedEventList, PaginatedRunList,
PaginationMeta, PreflightResponse, PreviewUrlRequest, PreviewUrlResponse, Provider,
ProviderCredentialTestRequest, ProviderCredentialTestResponse, ProviderList, PruneRunEntry,
PruneRunsRequest, PruneRunsResponse, RenderWorkflowGraphDirection, RenderWorkflowGraphRequest,
Run, RunArtifactEntry, RunArtifactListResponse, RunError, RunManifest, RunStage, RunUsage,
RunUsageStage, RunUsageTotals, SandboxDetails, SandboxFileEntry, SandboxFileListResponse,
SandboxService, SandboxServiceListResponse, SshAccessRequest, SshAccessResponse, StageHandler,
StageState, StartRunRequest, SubmitAnswerRequest, SystemCpuResourceScope, SystemCpuResources,
SystemDiskResourceScope, SystemDiskResources, SystemInfoResponse, SystemIntegrationStatus,
SystemIntegrationsResponse, SystemMemoryResourceScope, SystemMemoryResources,
SystemRepairRunIssue, SystemRepairRunsResponse, SystemResourcesResponse, SystemRunCounts,
TimelineEntryResponse, UpdateVariableRequest, UsageByModel, UsageStageRef,
VariableListResponse, VncPreviewResponse, WriteBlobResponse,
UpdateVariableRequest, UsageByModel, UsageStageRef, VariableListResponse, VncPreviewResponse,
WriteBlobResponse,
};
use fabro_auth::SqlVaultCredentialSource;
use fabro_automation::{self, AutomationStore};

View file

@ -82,11 +82,6 @@ pub struct SessionEventStream {
buffered_events: VecDeque<EventEnvelope>,
}
pub struct RewindRunResult {
pub status: u16,
pub response: types::RewindResponse,
}
#[derive(Default)]
struct ListStoreRunsOptions {
parent_id: Option<RunId>,
@ -1351,59 +1346,6 @@ impl Client {
convert_type(response.into_inner())
}
pub async fn rewind_run(
&self,
run_id: &RunId,
request: types::RewindRequest,
) -> Result<RewindRunResult> {
let response = self
.send_api(|client| async move {
client
.rewind_run()
.id(run_id.to_string())
.body(request)
.send()
.await
})
.await?;
let status = response.status().as_u16();
Ok(RewindRunResult {
status,
response: response.into_inner(),
})
}
pub async fn fork_run(
&self,
run_id: &RunId,
request: types::ForkRequest,
) -> Result<types::ForkResponse> {
let response = self
.send_api(|client| async move {
client
.fork_run()
.id(run_id.to_string())
.body(request)
.send()
.await
})
.await?;
Ok(response.into_inner())
}
pub async fn run_timeline(&self, run_id: &RunId) -> Result<Vec<types::TimelineEntryResponse>> {
let response = self
.send_api(|client| async move {
client
.get_run_timeline()
.id(run_id.to_string())
.send()
.await
})
.await?;
Ok(response.into_inner())
}
pub async fn list_store_runs(&self) -> Result<Vec<Run>> {
self.list_store_runs_with_options(ListStoreRunsOptions::default())
.await

View file

@ -167,8 +167,6 @@ models/failure-reason.ts
models/file-checkpoint.ts
models/file-diff.ts
models/folder-run-target.ts
models/fork-request.ts
models/fork-response.ts
models/fork-source-ref.ts
models/git-author-settings.ts
models/git-context.ts
@ -370,8 +368,6 @@ models/repository-ref.ts
models/resolved-automation-git-workflow-source.ts
models/review-target-kind.ts
models/review-target.ts
models/rewind-request.ts
models/rewind-response.ts
models/root-response-urls.ts
models/root-response.ts
models/run-agent-settings.ts
@ -549,7 +545,6 @@ models/system-repair-run-issue.ts
models/system-repair-runs-response.ts
models/system-resources-response.ts
models/system-run-counts.ts
models/timeline-entry-response.ts
models/tls-mode.ts
models/todo-list-kind.ts
models/todo-list-projection.ts

View file

@ -42,10 +42,6 @@ import type { DenyRunRequest } from '../models';
// @ts-ignore
import type { ErrorResponse } from '../models';
// @ts-ignore
import type { ForkRequest } from '../models';
// @ts-ignore
import type { ForkResponse } from '../models';
// @ts-ignore
import type { LinkRunPullRequestRequest } from '../models';
// @ts-ignore
import type { MergeRunPullRequestRequest } from '../models';
@ -64,10 +60,6 @@ import type { PullRequestResponse } from '../models';
// @ts-ignore
import type { RenderWorkflowGraphRequest } from '../models';
// @ts-ignore
import type { RewindRequest } from '../models';
// @ts-ignore
import type { RewindResponse } from '../models';
// @ts-ignore
import type { Run } from '../models';
// @ts-ignore
import type { RunIntent } from '../models';
@ -76,8 +68,6 @@ import type { RunManifest } from '../models';
// @ts-ignore
import type { StartRunRequest } from '../models';
// @ts-ignore
import type { TimelineEntryResponse } from '../models';
// @ts-ignore
import type { UpdateRunParentRequest } from '../models';
// @ts-ignore
import type { UpdateRunRequest } from '../models';
@ -545,49 +535,6 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
options: localVarRequestOptions,
};
},
/**
* Creates a new run from a checkpoint of the source run. The source run is left untouched.
* @summary Fork Run
* @param {string} id Unique run identifier (ULID).
* @param {ForkRequest} [forkRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
forkRun: async (id: string, forkRequest?: ForkRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('forkRun', 'id', id)
const localVarPath = `/api/v1/runs/{id}/fork`
.replace(`{${"id"}}`, encodeURIComponent(String(id)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication SessionCookie required
// authentication BearerAuth required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
localVarHeaderParameter['Content-Type'] = 'application/json';
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
localVarRequestOptions.data = serializeDataIfNeeded(forkRequest, localVarRequestOptions, configuration)
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
* Returns the stored pull request record for a run plus live GitHub details when available.
* @summary Get Run Pull Request
@ -668,46 +615,6 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
options: localVarRequestOptions,
};
},
/**
* Returns checkpoint timeline entries from durable run-store checkpoints. Metadata branches are write-only archives and are not read by this endpoint.
* @summary Get Run Timeline
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getRunTimeline: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('getRunTimeline', 'id', id)
const localVarPath = `/api/v1/runs/{id}/timeline`
.replace(`{${"id"}}`, encodeURIComponent(String(id)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication SessionCookie required
// authentication BearerAuth required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
* Links a run under an orchestration parent. Parent links are mutable for all run states, including archived and terminal runs.
* @summary Link Run Parent
@ -1163,89 +1070,6 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
options: localVarRequestOptions,
};
},
/**
* Creates a fresh run from the terminal source run\'s captured durable definition, records `retried_from` on the new run, and schedules it for execution. The source run is left unchanged. Active and archived runs are not retryable.
* @summary Retry Run
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
retryRun: async (id: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('retryRun', 'id', id)
const localVarPath = `/api/v1/runs/{id}/retry`
.replace(`{${"id"}}`, encodeURIComponent(String(id)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication SessionCookie required
// authentication BearerAuth required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
* Creates a new run from an earlier checkpoint of a terminal source run, archives the source run, and records `run.superseded_by` on the source after archive succeeds. Returns 207 when the new run was created but the source archive step failed.
* @summary Rewind Run
* @param {string} id Unique run identifier (ULID).
* @param {RewindRequest} [rewindRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
rewindRun: async (id: string, rewindRequest?: RewindRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'id' is not null or undefined
assertParamExists('rewindRun', 'id', id)
const localVarPath = `/api/v1/runs/{id}/rewind`
.replace(`{${"id"}}`, encodeURIComponent(String(id)));
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication SessionCookie required
// authentication BearerAuth required
// http bearer authentication required
await setBearerAuthToObject(localVarHeaderParameter, configuration)
localVarHeaderParameter['Content-Type'] = 'application/json';
localVarHeaderParameter['Accept'] = 'application/json';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
localVarRequestOptions.data = serializeDataIfNeeded(rewindRequest, localVarRequestOptions, configuration)
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
* Validates runtime readiness for a workflow manifest without creating a run.
* @summary Validate Workflow Manifest
@ -1731,20 +1555,6 @@ export const RunsApiFp = function(configuration?: Configuration) {
const localVarOperationServerBasePath = operationServerMap['RunsApi.denyRun']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Creates a new run from a checkpoint of the source run. The source run is left untouched.
* @summary Fork Run
* @param {string} id Unique run identifier (ULID).
* @param {ForkRequest} [forkRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async forkRun(id: string, forkRequest?: ForkRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<ForkResponse>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.forkRun(id, forkRequest, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RunsApi.forkRun']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns the stored pull request record for a run plus live GitHub details when available.
* @summary Get Run Pull Request
@ -1771,19 +1581,6 @@ export const RunsApiFp = function(configuration?: Configuration) {
const localVarOperationServerBasePath = operationServerMap['RunsApi.getRunPullRequestCreation']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Returns checkpoint timeline entries from durable run-store checkpoints. Metadata branches are write-only archives and are not read by this endpoint.
* @summary Get Run Timeline
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async getRunTimeline(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Array<TimelineEntryResponse>>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.getRunTimeline(id, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RunsApi.getRunTimeline']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Links a run under an orchestration parent. Parent links are mutable for all run states, including archived and terminal runs.
* @summary Link Run Parent
@ -1924,33 +1721,6 @@ export const RunsApiFp = function(configuration?: Configuration) {
const localVarOperationServerBasePath = operationServerMap['RunsApi.retrieveRunGraphSource']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Creates a fresh run from the terminal source run\'s captured durable definition, records `retried_from` on the new run, and schedules it for execution. The source run is left unchanged. Active and archived runs are not retryable.
* @summary Retry Run
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async retryRun(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Run>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.retryRun(id, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RunsApi.retryRun']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Creates a new run from an earlier checkpoint of a terminal source run, archives the source run, and records `run.superseded_by` on the source after archive succeeds. Returns 207 when the new run was created but the source archive step failed.
* @summary Rewind Run
* @param {string} id Unique run identifier (ULID).
* @param {RewindRequest} [rewindRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async rewindRun(id: string, rewindRequest?: RewindRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<RewindResponse>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.rewindRun(id, rewindRequest, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RunsApi.rewindRun']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
* Validates runtime readiness for a workflow manifest without creating a run.
* @summary Validate Workflow Manifest
@ -2179,17 +1949,6 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
denyRun(id: string, denyRunRequest?: DenyRunRequest, options?: RawAxiosRequestConfig): AxiosPromise<Run> {
return localVarFp.denyRun(id, denyRunRequest, options).then((request) => request(axios, basePath));
},
/**
* Creates a new run from a checkpoint of the source run. The source run is left untouched.
* @summary Fork Run
* @param {string} id Unique run identifier (ULID).
* @param {ForkRequest} [forkRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
forkRun(id: string, forkRequest?: ForkRequest, options?: RawAxiosRequestConfig): AxiosPromise<ForkResponse> {
return localVarFp.forkRun(id, forkRequest, options).then((request) => request(axios, basePath));
},
/**
* Returns the stored pull request record for a run plus live GitHub details when available.
* @summary Get Run Pull Request
@ -2210,16 +1969,6 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
getRunPullRequestCreation(id: string, options?: RawAxiosRequestConfig): AxiosPromise<PullRequestCreation> {
return localVarFp.getRunPullRequestCreation(id, options).then((request) => request(axios, basePath));
},
/**
* Returns checkpoint timeline entries from durable run-store checkpoints. Metadata branches are write-only archives and are not read by this endpoint.
* @summary Get Run Timeline
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
getRunTimeline(id: string, options?: RawAxiosRequestConfig): AxiosPromise<Array<TimelineEntryResponse>> {
return localVarFp.getRunTimeline(id, options).then((request) => request(axios, basePath));
},
/**
* Links a run under an orchestration parent. Parent links are mutable for all run states, including archived and terminal runs.
* @summary Link Run Parent
@ -2330,27 +2079,6 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
retrieveRunGraphSource(id: string, options?: RawAxiosRequestConfig): AxiosPromise<string> {
return localVarFp.retrieveRunGraphSource(id, options).then((request) => request(axios, basePath));
},
/**
* Creates a fresh run from the terminal source run\'s captured durable definition, records `retried_from` on the new run, and schedules it for execution. The source run is left unchanged. Active and archived runs are not retryable.
* @summary Retry Run
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
retryRun(id: string, options?: RawAxiosRequestConfig): AxiosPromise<Run> {
return localVarFp.retryRun(id, options).then((request) => request(axios, basePath));
},
/**
* Creates a new run from an earlier checkpoint of a terminal source run, archives the source run, and records `run.superseded_by` on the source after archive succeeds. Returns 207 when the new run was created but the source archive step failed.
* @summary Rewind Run
* @param {string} id Unique run identifier (ULID).
* @param {RewindRequest} [rewindRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
rewindRun(id: string, rewindRequest?: RewindRequest, options?: RawAxiosRequestConfig): AxiosPromise<RewindResponse> {
return localVarFp.rewindRun(id, rewindRequest, options).then((request) => request(axios, basePath));
},
/**
* Validates runtime readiness for a workflow manifest without creating a run.
* @summary Validate Workflow Manifest
@ -2564,18 +2292,6 @@ export class RunsApi extends BaseAPI {
return RunsApiFp(this.configuration).denyRun(id, denyRunRequest, options).then((request) => request(this.axios, this.basePath));
}
/**
* Creates a new run from a checkpoint of the source run. The source run is left untouched.
* @summary Fork Run
* @param {string} id Unique run identifier (ULID).
* @param {ForkRequest} [forkRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public forkRun(id: string, forkRequest?: ForkRequest, options?: RawAxiosRequestConfig) {
return RunsApiFp(this.configuration).forkRun(id, forkRequest, options).then((request) => request(this.axios, this.basePath));
}
/**
* Returns the stored pull request record for a run plus live GitHub details when available.
* @summary Get Run Pull Request
@ -2598,17 +2314,6 @@ export class RunsApi extends BaseAPI {
return RunsApiFp(this.configuration).getRunPullRequestCreation(id, options).then((request) => request(this.axios, this.basePath));
}
/**
* Returns checkpoint timeline entries from durable run-store checkpoints. Metadata branches are write-only archives and are not read by this endpoint.
* @summary Get Run Timeline
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public getRunTimeline(id: string, options?: RawAxiosRequestConfig) {
return RunsApiFp(this.configuration).getRunTimeline(id, options).then((request) => request(this.axios, this.basePath));
}
/**
* Links a run under an orchestration parent. Parent links are mutable for all run states, including archived and terminal runs.
* @summary Link Run Parent
@ -2729,29 +2434,6 @@ export class RunsApi extends BaseAPI {
return RunsApiFp(this.configuration).retrieveRunGraphSource(id, options).then((request) => request(this.axios, this.basePath));
}
/**
* Creates a fresh run from the terminal source run\'s captured durable definition, records `retried_from` on the new run, and schedules it for execution. The source run is left unchanged. Active and archived runs are not retryable.
* @summary Retry Run
* @param {string} id Unique run identifier (ULID).
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public retryRun(id: string, options?: RawAxiosRequestConfig) {
return RunsApiFp(this.configuration).retryRun(id, options).then((request) => request(this.axios, this.basePath));
}
/**
* Creates a new run from an earlier checkpoint of a terminal source run, archives the source run, and records `run.superseded_by` on the source after archive succeeds. Returns 207 when the new run was created but the source archive step failed.
* @summary Rewind Run
* @param {string} id Unique run identifier (ULID).
* @param {RewindRequest} [rewindRequest]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public rewindRun(id: string, rewindRequest?: RewindRequest, options?: RawAxiosRequestConfig) {
return RunsApiFp(this.configuration).rewindRun(id, rewindRequest, options).then((request) => request(this.axios, this.basePath));
}
/**
* Validates runtime readiness for a workflow manifest without creating a run.
* @summary Validate Workflow Manifest

View file

@ -138,8 +138,6 @@ export * from './failure-reason';
export * from './file-checkpoint';
export * from './file-diff';
export * from './folder-run-target';
export * from './fork-request';
export * from './fork-response';
export * from './fork-source-ref';
export * from './git-author-settings';
export * from './git-context';
@ -340,8 +338,6 @@ export * from './repository-ref';
export * from './resolved-automation-git-workflow-source';
export * from './review-target';
export * from './review-target-kind';
export * from './rewind-request';
export * from './rewind-response';
export * from './root-response';
export * from './root-response-urls';
export * from './run';
@ -519,7 +515,6 @@ export * from './system-repair-run-issue';
export * from './system-repair-runs-response';
export * from './system-resources-response';
export * from './system-run-counts';
export * from './timeline-entry-response';
export * from './tls-mode';
export * from './todo-list-kind';
export * from './todo-list-projection';