mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-09-07 08:27:12 +00:00
refactor(core): simplify reviewed run cleanup
Reuse shared frontend formatting and SSE dedupe helpers, tighten typed sandbox handling, remove obsolete run DTOs, and collapse auth-session revoke into a single store operation.
This commit is contained in:
parent
cccb557281
commit
4fa4716015
82 changed files with 587 additions and 641 deletions
|
|
@ -347,6 +347,27 @@ const BAR_NORMAL_HEIGHT = 22;
|
|||
const BAR_HOVER_HEIGHT = 26;
|
||||
const BAR_SELECTED_HEIGHT = 28;
|
||||
const BAR_WIDTH = 4;
|
||||
const STRIP_MAX_MARKERS = 600;
|
||||
|
||||
function sampleStripItems<T>(
|
||||
items: T[],
|
||||
maxItems: number,
|
||||
keep: (item: T) => boolean,
|
||||
): T[] {
|
||||
if (items.length <= maxItems) return items;
|
||||
|
||||
const indices = new Set<number>();
|
||||
for (let i = 0; i < items.length; i += 1) {
|
||||
if (keep(items[i])) indices.add(i);
|
||||
}
|
||||
for (let i = 0; i < maxItems; i += 1) {
|
||||
indices.add(Math.round((i * (items.length - 1)) / Math.max(1, maxItems - 1)));
|
||||
}
|
||||
|
||||
return Array.from(indices)
|
||||
.sort((a, b) => a - b)
|
||||
.map((index) => items[index]);
|
||||
}
|
||||
|
||||
function friendlyEventName(eventName: string): string {
|
||||
const parts = eventName.split(".");
|
||||
|
|
@ -369,6 +390,14 @@ export function DebugDnaStrip({
|
|||
seq: number;
|
||||
rect: DOMRect;
|
||||
} | null>(null);
|
||||
const visibleEvents = useMemo(
|
||||
() => sampleStripItems(events, STRIP_MAX_MARKERS, (event) => event.seq === selectedSeq),
|
||||
[events, selectedSeq],
|
||||
);
|
||||
const visibleEventBySeq = useMemo(
|
||||
() => new Map(visibleEvents.map((event) => [event.seq, event])),
|
||||
[visibleEvents],
|
||||
);
|
||||
|
||||
const range = useMemo(() => {
|
||||
if (events.length === 0) return null;
|
||||
|
|
@ -400,7 +429,7 @@ export function DebugDnaStrip({
|
|||
}
|
||||
|
||||
const hoveredEvent =
|
||||
hover != null ? events.find((e) => e.seq === hover.seq) ?? null : null;
|
||||
hover != null ? visibleEventBySeq.get(hover.seq) ?? null : null;
|
||||
|
||||
return (
|
||||
<div
|
||||
|
|
@ -408,7 +437,7 @@ export function DebugDnaStrip({
|
|||
style={{ height: STRIP_HEIGHT }}
|
||||
>
|
||||
<div className="relative h-full">
|
||||
{events.map((event) => {
|
||||
{visibleEvents.map((event) => {
|
||||
const ms = Date.parse(event.ts);
|
||||
if (Number.isNaN(ms)) return null;
|
||||
const pct = ((ms - range.start) / range.duration) * 100;
|
||||
|
|
@ -575,6 +604,19 @@ export function ThreadDnaStrip({
|
|||
const [hover, setHover] = useState<{ key: string; rect: DOMRect } | null>(
|
||||
null,
|
||||
);
|
||||
const visibleItems = useMemo(
|
||||
() => sampleStripItems(items, STRIP_MAX_MARKERS, (item) =>
|
||||
selectionsEqual(item.selection, selection)
|
||||
),
|
||||
[items, selection],
|
||||
);
|
||||
const visibleItemByKey = useMemo(
|
||||
() =>
|
||||
new Map(
|
||||
visibleItems.map((item) => [selectionKey(item.selection), item]),
|
||||
),
|
||||
[visibleItems],
|
||||
);
|
||||
|
||||
const totalMs = useMemo(() => {
|
||||
let max = 0;
|
||||
|
|
@ -597,7 +639,7 @@ export function ThreadDnaStrip({
|
|||
|
||||
const hoveredItem =
|
||||
hover != null
|
||||
? items.find((it) => selectionKey(it.selection) === hover.key) ?? null
|
||||
? visibleItemByKey.get(hover.key) ?? null
|
||||
: null;
|
||||
|
||||
return (
|
||||
|
|
@ -606,7 +648,7 @@ export function ThreadDnaStrip({
|
|||
style={{ height: STRIP_HEIGHT }}
|
||||
>
|
||||
<div className="relative h-full">
|
||||
{items.map((item) => {
|
||||
{visibleItems.map((item) => {
|
||||
const key = selectionKey(item.selection);
|
||||
const isInstant = item.durationMs <= 0;
|
||||
const isSelected = selectionsEqual(item.selection, selection);
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import {
|
|||
import type { EventEnvelope } from "@qltysh/fabro-api-client";
|
||||
|
||||
import type { Stage } from "../stage-sidebar";
|
||||
import { formatTokenCount } from "../../lib/format";
|
||||
import { getString } from "../../lib/unknown";
|
||||
import { Markdown, prettyJson } from "./primitives";
|
||||
import { StageMetaBar } from "./meta-bar";
|
||||
|
|
@ -50,12 +51,6 @@ function extractReducerTurn(events: EventEnvelope[]): ReducerTurn | null {
|
|||
return hasReducer ? { prompt, response, model, inputTokens, outputTokens } : null;
|
||||
}
|
||||
|
||||
function formatTokens(n: number): string {
|
||||
if (n < 1000) return `${n}`;
|
||||
if (n < 1_000_000) return `${Math.round(n / 1000)}k`;
|
||||
return `${Math.round(n / 1_000_000)}M`;
|
||||
}
|
||||
|
||||
/**
|
||||
* The fan-in `stage.prompt.text` is built by the handler as
|
||||
* "<prompt>\n\n<json>". Split it for nicer display so the JSON candidate set
|
||||
|
|
@ -178,7 +173,7 @@ export function FanInResults({
|
|||
</span>
|
||||
{(reducer.inputTokens > 0 || reducer.outputTokens > 0) && (
|
||||
<span className="ml-auto font-mono normal-case tracking-normal text-fg-muted">
|
||||
{formatTokens(reducer.inputTokens)} / {formatTokens(reducer.outputTokens)} tokens
|
||||
{formatTokenCount(reducer.inputTokens)} / {formatTokenCount(reducer.outputTokens)} tokens
|
||||
</span>
|
||||
)}
|
||||
</header>
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import type { EventEnvelope } from "@qltysh/fabro-api-client";
|
|||
|
||||
import type { Stage } from "../stage-sidebar";
|
||||
import { Tooltip } from "../ui";
|
||||
import { formatAbsoluteTs } from "../../lib/format";
|
||||
import { formatAbsoluteTs, formatDurationMs } from "../../lib/format";
|
||||
import { ACTIVE_STAGE_STATES } from "../../lib/stage-sidebar";
|
||||
import { Markdown } from "./primitives";
|
||||
import { StageMetaBar } from "./meta-bar";
|
||||
|
|
@ -22,14 +22,6 @@ import {
|
|||
type InterviewOption,
|
||||
} from "./helpers";
|
||||
|
||||
function formatDurationMs(ms: number): string {
|
||||
if (ms < 1000) return `${Math.round(ms)}ms`;
|
||||
if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;
|
||||
const mins = Math.floor(ms / 60_000);
|
||||
const secs = Math.round((ms % 60_000) / 1000);
|
||||
return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;
|
||||
}
|
||||
|
||||
function questionTypeLabel(type: string): string {
|
||||
switch (type) {
|
||||
case "multiple_choice":
|
||||
|
|
|
|||
|
|
@ -1,54 +0,0 @@
|
|||
import {
|
||||
ArrowPathRoundedSquareIcon,
|
||||
InformationCircleIcon,
|
||||
} from "@heroicons/react/20/solid";
|
||||
|
||||
import type { Stage } from "../stage-sidebar";
|
||||
import { StageMetaBar } from "./meta-bar";
|
||||
|
||||
// TODO: render an iterations list once the manager-loop handler emits cycle
|
||||
// boundary events (e.g. `manager_loop.cycle.started/completed`). Today the
|
||||
// child workflow's events flow on the parent run's stream without a marker
|
||||
// linking them back to this stage.
|
||||
|
||||
export function ManagerLoopSummary({
|
||||
stage,
|
||||
notes,
|
||||
}: {
|
||||
stage: Stage;
|
||||
notes: string | null;
|
||||
}) {
|
||||
const cycleHint = notes ?? null;
|
||||
|
||||
return (
|
||||
<div className="space-y-6 pl-3 pr-4 sm:pr-6 lg:pr-8">
|
||||
<StageMetaBar stage={stage} />
|
||||
|
||||
<section className="rounded-lg bg-panel p-5 outline-1 -outline-offset-1 outline-line">
|
||||
<div className="flex items-center gap-2 text-xs">
|
||||
<ArrowPathRoundedSquareIcon className="size-4 text-teal-500" aria-hidden="true" />
|
||||
<span className="font-medium uppercase tracking-wider text-fg-muted">
|
||||
Manager loop
|
||||
</span>
|
||||
</div>
|
||||
<p className="mt-2 text-sm text-fg-2">
|
||||
<span className="font-mono text-fg">{stage.nodeId}</span> ran a nested
|
||||
workflow until its stop condition was satisfied.
|
||||
</p>
|
||||
{cycleHint && (
|
||||
<p className="mt-3 rounded-md bg-overlay-strong px-3 py-2 font-mono text-xs text-fg-3">
|
||||
{cycleHint}
|
||||
</p>
|
||||
)}
|
||||
<p className="mt-3 inline-flex items-start gap-1.5 text-xs text-fg-muted">
|
||||
<InformationCircleIcon
|
||||
className="mt-px size-3.5 shrink-0"
|
||||
aria-hidden="true"
|
||||
/>
|
||||
Per-iteration progress isn't broken out yet — open the Debug tab to
|
||||
inspect raw events from the child workflow.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -5,6 +5,7 @@ import type { EventEnvelope } from "@qltysh/fabro-api-client";
|
|||
|
||||
import type { Stage } from "../stage-sidebar";
|
||||
import { CopyButton } from "../ui";
|
||||
import { formatDurationMs } from "../../lib/format";
|
||||
import { StageMetaBar } from "./meta-bar";
|
||||
import { parseParallelOverview, type ParallelBranchResult } from "./helpers";
|
||||
|
||||
|
|
@ -51,14 +52,6 @@ function StatItem({
|
|||
);
|
||||
}
|
||||
|
||||
function formatMs(ms: number): string {
|
||||
if (ms < 1000) return `${Math.round(ms)}ms`;
|
||||
if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;
|
||||
const mins = Math.floor(ms / 60_000);
|
||||
const secs = Math.round((ms % 60_000) / 1000);
|
||||
return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;
|
||||
}
|
||||
|
||||
function ChildRow({
|
||||
result,
|
||||
stageHref,
|
||||
|
|
@ -172,7 +165,7 @@ export function ParallelChildren({
|
|||
/>
|
||||
<StatItem
|
||||
label="Duration"
|
||||
value={overview.durationMs != null ? formatMs(overview.durationMs) : overview.isComplete ? "—" : "running"}
|
||||
value={overview.durationMs != null ? formatDurationMs(overview.durationMs) : overview.isComplete ? "—" : "running"}
|
||||
/>
|
||||
</section>
|
||||
|
||||
|
|
|
|||
|
|
@ -47,11 +47,38 @@ describe("terminal view helpers", () => {
|
|||
});
|
||||
|
||||
test("uses sandbox id as terminal status detail", () => {
|
||||
expect(sandboxStatusDetail({ provider: "docker", id: "container-abc123" }))
|
||||
expect(sandboxStatusDetail({
|
||||
provider: "docker",
|
||||
image: null,
|
||||
snapshot: null,
|
||||
runtime: {
|
||||
id: "container-abc123",
|
||||
working_directory: "/workspace",
|
||||
repo_cloned: null,
|
||||
clone_origin_url: null,
|
||||
clone_branch: null,
|
||||
},
|
||||
}))
|
||||
.toBe("container-abc123");
|
||||
expect(sandboxStatusDetail({ provider: "daytona", id: "sandbox-name" }))
|
||||
expect(sandboxStatusDetail({
|
||||
provider: "daytona",
|
||||
image: null,
|
||||
snapshot: null,
|
||||
runtime: {
|
||||
id: "sandbox-name",
|
||||
working_directory: "/workspace",
|
||||
repo_cloned: null,
|
||||
clone_origin_url: null,
|
||||
clone_branch: null,
|
||||
},
|
||||
}))
|
||||
.toBe("sandbox-name");
|
||||
expect(sandboxStatusDetail({ provider: "docker" })).toBe("docker");
|
||||
expect(sandboxStatusDetail({
|
||||
provider: "docker",
|
||||
image: null,
|
||||
snapshot: null,
|
||||
runtime: null,
|
||||
})).toBe("docker");
|
||||
expect(sandboxStatusDetail(null)).toBeNull();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import {
|
|||
ArrowTopRightOnSquareIcon,
|
||||
ClipboardDocumentIcon,
|
||||
} from "@heroicons/react/20/solid";
|
||||
import type { RunSandbox } from "@qltysh/fabro-api-client";
|
||||
|
||||
import { SECONDARY_BUTTON_CLASS, Tooltip } from "./ui";
|
||||
import { ErrorState } from "./state";
|
||||
|
|
@ -108,20 +109,8 @@ function terminalAccessCommandErrorMessage(provider: string | null): string {
|
|||
: "Could not copy SSH command.";
|
||||
}
|
||||
|
||||
function getObject(value: unknown, key: string): Record<string, unknown> | null {
|
||||
if (!value || typeof value !== "object") return null;
|
||||
const child = (value as Record<string, unknown>)[key];
|
||||
return child && typeof child === "object" ? child as Record<string, unknown> : null;
|
||||
}
|
||||
|
||||
function getString(value: Record<string, unknown> | null, key: string): string | null {
|
||||
const child = value?.[key];
|
||||
return typeof child === "string" ? child : null;
|
||||
}
|
||||
|
||||
export function sandboxStatusDetail(sandbox: Record<string, unknown> | null): string | null {
|
||||
return getString(sandbox, "id")
|
||||
?? getString(sandbox, "provider");
|
||||
export function sandboxStatusDetail(sandbox: RunSandbox | null | undefined): string | null {
|
||||
return sandbox?.runtime?.id ?? sandbox?.provider ?? null;
|
||||
}
|
||||
|
||||
function sendResize(socket: WebSocket | null, terminal: XtermTerminal | null) {
|
||||
|
|
@ -200,9 +189,8 @@ export default function TerminalView({
|
|||
}) {
|
||||
const { push } = useToast();
|
||||
const stateQuery = useRunState(runId);
|
||||
const sandbox = getObject(getObject(stateQuery.data, "run"), "sandbox")
|
||||
?? getObject(stateQuery.data, "sandbox");
|
||||
const provider = getString(sandbox, "provider");
|
||||
const sandbox = stateQuery.data?.sandbox ?? null;
|
||||
const provider = sandbox?.provider ?? null;
|
||||
const sandboxDetail = sandboxStatusDetail(sandbox);
|
||||
const accessCommandLabel = terminalAccessCommandLabel(provider);
|
||||
const [connectionKey, setConnectionKey] = useState(0);
|
||||
|
|
|
|||
|
|
@ -4,29 +4,8 @@ import {
|
|||
type BoardColumn as ApiBoardColumn,
|
||||
type Run,
|
||||
type RunStatus as ApiRunStatus,
|
||||
type SandboxResources,
|
||||
} from "@qltysh/fabro-api-client";
|
||||
|
||||
const BYTES_PER_GIB = 1024 * 1024 * 1024;
|
||||
|
||||
function formatBoardResources(resources: SandboxResources | null | undefined): string | undefined {
|
||||
if (!resources) {
|
||||
return undefined;
|
||||
}
|
||||
const parts: string[] = [];
|
||||
if (resources.cpu_cores != null) {
|
||||
parts.push(`${formatCpuCores(resources.cpu_cores)} CPU`);
|
||||
}
|
||||
if (resources.memory_bytes != null) {
|
||||
parts.push(`${Math.round(resources.memory_bytes / BYTES_PER_GIB)} GB`);
|
||||
}
|
||||
return parts.length > 0 ? parts.join(" / ") : undefined;
|
||||
}
|
||||
|
||||
function formatCpuCores(cores: number): string {
|
||||
return Number.isInteger(cores) ? cores.toString() : cores.toFixed(1);
|
||||
}
|
||||
|
||||
export type CiStatus = "passing" | "failing" | "pending";
|
||||
|
||||
export type CheckStatus = "success" | "failure" | "skipped" | "pending" | "queued";
|
||||
|
|
|
|||
|
|
@ -1162,7 +1162,7 @@ function candidateKey(candidate: CandidateMessage): string {
|
|||
return `${candidate.candidateGeneration}:${candidate.candidateId}`;
|
||||
}
|
||||
|
||||
function eventDedupeKey(payload: EventPayload): string | undefined {
|
||||
export function eventDedupeKey(payload: EventPayload): string | undefined {
|
||||
if (typeof payload.id === "string" && payload.id.length > 0) {
|
||||
return payload.id;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,3 +79,17 @@ export function formatDurationSecs(secs: number): string {
|
|||
const remainMin = minutes % 60;
|
||||
return remainMin > 0 ? `${hours}h ${remainMin}m` : `${hours}h`;
|
||||
}
|
||||
|
||||
export function formatDurationMs(ms: number): string {
|
||||
if (ms < 1000) return `${Math.round(ms)}ms`;
|
||||
if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;
|
||||
const minutes = Math.floor(ms / 60_000);
|
||||
const seconds = Math.round((ms % 60_000) / 1000);
|
||||
return seconds > 0 ? `${minutes}m ${seconds}s` : `${minutes}m`;
|
||||
}
|
||||
|
||||
export function formatTokenCount(value: number): string {
|
||||
if (value < 1000) return `${value}`;
|
||||
if (value < 1_000_000) return `${Math.round(value / 1000)}k`;
|
||||
return `${Math.round(value / 1_000_000)}M`;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -583,7 +583,7 @@ describe("selectStageRenderer", () => {
|
|||
expect(selectStageRenderer("conditional")).toBe("conditional");
|
||||
expect(selectStageRenderer("parallel")).toBe("parallel");
|
||||
expect(selectStageRenderer("parallel.fan_in")).toBe("fan_in");
|
||||
expect(selectStageRenderer("stack.manager_loop")).toBe("manager_loop");
|
||||
expect(selectStageRenderer("stack.manager_loop")).toBe("summary");
|
||||
expect(selectStageRenderer("wait")).toBe("wait");
|
||||
});
|
||||
|
||||
|
|
@ -602,7 +602,6 @@ describe("eventsTabLabel", () => {
|
|||
"conditional",
|
||||
"parallel",
|
||||
"fan_in",
|
||||
"manager_loop",
|
||||
"wait",
|
||||
"summary",
|
||||
] as const) {
|
||||
|
|
@ -617,7 +616,6 @@ describe("eventsTabLabel", () => {
|
|||
expect(eventsTabLabel("primary", "conditional")).toBe("Decision");
|
||||
expect(eventsTabLabel("primary", "parallel")).toBe("Children");
|
||||
expect(eventsTabLabel("primary", "fan_in")).toBe("Results");
|
||||
expect(eventsTabLabel("primary", "manager_loop")).toBe("Iterations");
|
||||
expect(eventsTabLabel("primary", "wait")).toBe("Status");
|
||||
expect(eventsTabLabel("primary", "summary")).toBe("Summary");
|
||||
});
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ import { ConditionalDecision } from "../components/stage-renderers/conditional-d
|
|||
import { FanInResults } from "../components/stage-renderers/fan-in-results";
|
||||
import { extractStageNotes } from "../components/stage-renderers/helpers";
|
||||
import { HumanQA } from "../components/stage-renderers/human-qa";
|
||||
import { ManagerLoopSummary } from "../components/stage-renderers/manager-loop-summary";
|
||||
import { ParallelChildren } from "../components/stage-renderers/parallel-children";
|
||||
import {
|
||||
CodeBlock,
|
||||
|
|
@ -42,7 +41,12 @@ import {
|
|||
} from "../components/stage-renderers/primitives";
|
||||
import { StageSummary } from "../components/stage-renderers/stage-summary";
|
||||
import { WaitStatus } from "../components/stage-renderers/wait-status";
|
||||
import { formatAbsoluteTs, formatBytes } from "../lib/format";
|
||||
import {
|
||||
formatAbsoluteTs,
|
||||
formatBytes,
|
||||
formatDurationMs,
|
||||
formatTokenCount,
|
||||
} from "../lib/format";
|
||||
import {
|
||||
useRun,
|
||||
useRunEventsList,
|
||||
|
|
@ -82,7 +86,6 @@ export type StageRenderer =
|
|||
| "conditional"
|
||||
| "parallel"
|
||||
| "fan_in"
|
||||
| "manager_loop"
|
||||
| "wait"
|
||||
| "summary";
|
||||
|
||||
|
|
@ -112,7 +115,6 @@ const PRIMARY_TAB_LABEL: Record<StageRenderer, string> = {
|
|||
conditional: "Decision",
|
||||
parallel: "Children",
|
||||
fan_in: "Results",
|
||||
manager_loop: "Iterations",
|
||||
wait: "Status",
|
||||
summary: "Summary",
|
||||
};
|
||||
|
|
@ -141,8 +143,6 @@ export function selectStageRenderer(handler: StageHandler): StageRenderer {
|
|||
return "parallel";
|
||||
case "parallel.fan_in":
|
||||
return "fan_in";
|
||||
case "stack.manager_loop":
|
||||
return "manager_loop";
|
||||
case "wait":
|
||||
return "wait";
|
||||
default:
|
||||
|
|
@ -595,17 +595,6 @@ function durationBetween(startTs: string | undefined, endTs: string): number {
|
|||
return Math.max(0, endMs - startMs);
|
||||
}
|
||||
|
||||
function formatDurationMs(ms: number): string {
|
||||
if (ms < 1000) return `${Math.round(ms)}ms`;
|
||||
return `${(ms / 1000).toFixed(1)}s`;
|
||||
}
|
||||
|
||||
function formatTokenCount(n: number): string {
|
||||
if (n < 1000) return `${n}`;
|
||||
if (n < 1_000_000) return `${Math.round(n / 1000)}k`;
|
||||
return `${Math.round(n / 1_000_000)}M`;
|
||||
}
|
||||
|
||||
export function turnMetric(turn: TurnType): string | null {
|
||||
switch (turn.kind) {
|
||||
case "assistant": {
|
||||
|
|
@ -1527,11 +1516,6 @@ export default function RunStages() {
|
|||
events={debugEvents}
|
||||
notes={extractStageNotes(debugEvents)}
|
||||
/>
|
||||
) : renderer === "manager_loop" ? (
|
||||
<ManagerLoopSummary
|
||||
stage={selectedStage}
|
||||
notes={extractStageNotes(debugEvents)}
|
||||
/>
|
||||
) : renderer === "wait" ? (
|
||||
<WaitStatus stage={selectedStage} />
|
||||
) : (
|
||||
|
|
|
|||
|
|
@ -72,12 +72,18 @@ describe("appendLiveEvent", () => {
|
|||
expect(result).toHaveLength(1);
|
||||
});
|
||||
|
||||
test("dedupes by run_id:seq when id is missing", () => {
|
||||
test("dedupes by run_id:seq:event when id is missing", () => {
|
||||
const a: LiveEventPayload = { run_id: "run-1", seq: 7, event: "x" };
|
||||
const result = appendLiveEvent([a], { run_id: "run-1", seq: 7, event: "x" });
|
||||
expect(result).toHaveLength(1);
|
||||
});
|
||||
|
||||
test("keeps different event names with the same run_id and seq", () => {
|
||||
const a: LiveEventPayload = { run_id: "run-1", seq: 7, event: "x" };
|
||||
const result = appendLiveEvent([a], { run_id: "run-1", seq: 7, event: "y" });
|
||||
expect(result).toHaveLength(2);
|
||||
});
|
||||
|
||||
test("treats events with neither id nor seq as distinct", () => {
|
||||
const a: LiveEventPayload = { event: "x" };
|
||||
const result = appendLiveEvent([a], { event: "x" });
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import {
|
|||
} from "../components/event-debug";
|
||||
import { EmptyState } from "../components/state";
|
||||
import { Tooltip } from "../components/ui";
|
||||
import { eventDedupeKey } from "../lib/cross-tab-sse";
|
||||
import { formatAbsoluteTs } from "../lib/format";
|
||||
import {
|
||||
subscribeToLiveEvents,
|
||||
|
|
@ -27,20 +28,12 @@ export const handle = { wide: true, fullHeight: true };
|
|||
|
||||
export const MAX_EVENTS = 1000;
|
||||
|
||||
export function eventDedupeKey(payload: LiveEventPayload): string | null {
|
||||
if (typeof payload.id === "string") return payload.id;
|
||||
if (typeof payload.run_id === "string" && typeof payload.seq === "number") {
|
||||
return `${payload.run_id}:${payload.seq}`;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export function appendLiveEvent(
|
||||
buffer: LiveEventPayload[],
|
||||
payload: LiveEventPayload,
|
||||
): LiveEventPayload[] {
|
||||
const key = eventDedupeKey(payload);
|
||||
if (key !== null && buffer.some((event) => eventDedupeKey(event) === key)) {
|
||||
if (key != null && buffer.some((event) => eventDedupeKey(event) === key)) {
|
||||
return buffer;
|
||||
}
|
||||
const next = [payload, ...buffer];
|
||||
|
|
|
|||
|
|
@ -158,4 +158,3 @@ Provider behavior:
|
|||
- Docker disk size is nullable until there is a reliable configured/container-specific limit.
|
||||
- `native_state` is for display/debugging only; UI behavior keys off normalized `state`.
|
||||
- Lifecycle settings and actions are intentionally out of scope for this PR.
|
||||
|
||||
|
|
|
|||
|
|
@ -14,8 +14,6 @@ mod generated {
|
|||
include!(concat!(env!("OUT_DIR"), "/codegen.rs"));
|
||||
}
|
||||
pub mod types {
|
||||
use std::collections::HashMap;
|
||||
|
||||
pub use fabro_model::{Model, ModelCosts, ModelFeatures, ModelLimits, ModelTestMode, Provider};
|
||||
pub use fabro_types::settings::server::{
|
||||
GithubIntegrationSettings, GithubIntegrationStrategy, IntegrationWebhooksSettings,
|
||||
|
|
@ -34,64 +32,16 @@ pub mod types {
|
|||
AuthMethod, BilledTokenCounts, CommandTermination, DiffStats, DiffSummary, DirtyStatus,
|
||||
EventEnvelope, GitContext, IdpIdentity, InterviewOption, InterviewQuestionRecord,
|
||||
PendingInterviewRecord, PreRunPushOutcome, Principal, PullRequest, PullRequestDetails,
|
||||
QuestionType, RepositoryRef, Run, RunClientProvenance, RunEvent, RunProjection,
|
||||
QuestionType, RepositoryRef, Run, RunClientProvenance, RunEvent, RunParts, RunProjection,
|
||||
RunProvenance, RunSandbox, RunSandboxRuntime, RunServerProvenance, SandboxDetails,
|
||||
SandboxProvider, SandboxResources, SandboxService, SandboxServiceListResponse,
|
||||
SandboxState, SandboxTimestamps, SecretMetadata, SecretType, ServerSettings,
|
||||
StageCompletion, StageHandler, StageOutcome, StageProjection, StageState, SystemActorKind,
|
||||
UserPrincipal, WorkflowSettings,
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
pub use crate::generated::types::*;
|
||||
|
||||
pub type RunSummary = fabro_types::Run;
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct RunStatusResponse {
|
||||
pub id: String,
|
||||
pub title: String,
|
||||
pub status: fabro_types::RunStatus,
|
||||
pub error: Option<RunError>,
|
||||
pub queue_position: Option<u32>,
|
||||
pub pending_control: Option<fabro_types::RunControlAction>,
|
||||
pub created_at: chrono::DateTime<chrono::Utc>,
|
||||
pub web_url: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct RunPullRequest {
|
||||
pub number: i64,
|
||||
pub html_url: Option<String>,
|
||||
pub additions: Option<i64>,
|
||||
pub deletions: Option<i64>,
|
||||
pub comments: Option<i64>,
|
||||
pub checks: Vec<CheckRun>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct RunListItem {
|
||||
pub run_id: String,
|
||||
pub workflow_name: Option<String>,
|
||||
pub workflow_slug: Option<String>,
|
||||
pub goal: String,
|
||||
pub repository: fabro_types::RepositoryRef,
|
||||
pub title: String,
|
||||
pub status: fabro_types::RunStatus,
|
||||
pub labels: HashMap<String, String>,
|
||||
pub source_directory: Option<String>,
|
||||
pub repo_origin_url: Option<String>,
|
||||
pub start_time: Option<chrono::DateTime<chrono::Utc>>,
|
||||
pub pending_control: Option<fabro_types::RunControlAction>,
|
||||
pub duration_ms: Option<i64>,
|
||||
pub elapsed_secs: Option<f64>,
|
||||
pub total_usd_micros: Option<i64>,
|
||||
pub column: BoardColumn,
|
||||
pub pull_request: Option<RunPullRequest>,
|
||||
pub sandbox: Option<fabro_types::RunSandbox>,
|
||||
pub question: Option<RunQuestion>,
|
||||
pub created_at: chrono::DateTime<chrono::Utc>,
|
||||
pub last_event_at: Option<chrono::DateTime<chrono::Utc>>,
|
||||
}
|
||||
}
|
||||
pub use generated::Client as ApiClient;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,9 @@ use std::collections::HashMap;
|
|||
use chrono::{TimeZone, Utc};
|
||||
use fabro_api::types::{RepositoryRef as ApiRepositoryRef, RunSummary as ApiRunSummary};
|
||||
use fabro_types::status::{RunStatus, SuccessReason};
|
||||
use fabro_types::{DiffSummary, PullRequest, RepositoryProvider, RepositoryRef, RunId, RunSummary};
|
||||
use fabro_types::{
|
||||
DiffSummary, PullRequest, RepositoryProvider, RepositoryRef, RunId, RunParts, RunSummary,
|
||||
};
|
||||
use serde_json::json;
|
||||
|
||||
#[test]
|
||||
|
|
@ -19,32 +21,32 @@ fn run_summary_json_matches_openapi_shape() {
|
|||
let run_id = RunId::with_timestamp(created_at, 7);
|
||||
let last_event_at = Utc.with_ymd_and_hms(2026, 4, 20, 12, 0, 42).unwrap();
|
||||
let archived_at = Utc.with_ymd_and_hms(2026, 4, 20, 12, 1, 0).unwrap();
|
||||
let summary = RunSummary::new(
|
||||
let summary = RunSummary::from_parts(RunParts {
|
||||
run_id,
|
||||
Some("workflow".to_string()),
|
||||
Some("workflow".to_string()),
|
||||
String::new(),
|
||||
"API title".to_string(),
|
||||
HashMap::from([("team".to_string(), "core".to_string())]),
|
||||
Some("/tmp/fabro".to_string()),
|
||||
None,
|
||||
None,
|
||||
Some(created_at),
|
||||
Some(last_event_at),
|
||||
None,
|
||||
RunStatus::Succeeded {
|
||||
workflow_name: Some("workflow".to_string()),
|
||||
workflow_slug: Some("workflow".to_string()),
|
||||
goal: String::new(),
|
||||
title: "API title".to_string(),
|
||||
labels: HashMap::from([("team".to_string(), "core".to_string())]),
|
||||
source_directory: Some("/tmp/fabro".to_string()),
|
||||
repo_origin_url: None,
|
||||
created_by: None,
|
||||
start_time: Some(created_at),
|
||||
last_event_at: Some(last_event_at),
|
||||
completed_at: None,
|
||||
status: RunStatus::Succeeded {
|
||||
reason: SuccessReason::PartialSuccess,
|
||||
},
|
||||
None,
|
||||
Some(42_000),
|
||||
Some(123),
|
||||
None,
|
||||
Some(DiffSummary {
|
||||
pending_control: None,
|
||||
duration_ms: Some(42_000),
|
||||
total_usd_micros: Some(123),
|
||||
superseded_by: None,
|
||||
diff_summary: Some(DiffSummary {
|
||||
files_changed: 3,
|
||||
additions: 12,
|
||||
deletions: 4,
|
||||
}),
|
||||
Some(PullRequest {
|
||||
pull_request: Some(PullRequest {
|
||||
provider: "github".to_string(),
|
||||
html_url: "https://github.com/fabro-sh/fabro/pull/123".to_string(),
|
||||
number: 123,
|
||||
|
|
@ -54,12 +56,12 @@ fn run_summary_json_matches_openapi_shape() {
|
|||
head_branch: "fabro/run/demo".to_string(),
|
||||
title: "Add run PR chip".to_string(),
|
||||
}),
|
||||
Some(archived_at),
|
||||
None,
|
||||
vec![],
|
||||
None,
|
||||
None,
|
||||
);
|
||||
archived_at: Some(archived_at),
|
||||
sandbox: None,
|
||||
models: vec![],
|
||||
current_question: None,
|
||||
web_url: None,
|
||||
});
|
||||
|
||||
assert_eq!(
|
||||
serde_json::to_value(&summary).unwrap(),
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use std::collections::BTreeMap;
|
||||
|
||||
use anyhow::Result;
|
||||
use chrono::{DateTime, Utc};
|
||||
use fabro_types::{
|
||||
RunId, RunSandbox, SandboxDetails, SandboxProvider, SandboxResources, SandboxState,
|
||||
SandboxTimestamps,
|
||||
|
|
@ -54,6 +55,12 @@ fn local_details(record: &RunSandbox) -> SandboxDetails {
|
|||
}
|
||||
}
|
||||
|
||||
fn parse_rfc3339_utc(value: &str) -> Option<DateTime<Utc>> {
|
||||
DateTime::parse_from_rfc3339(value)
|
||||
.ok()
|
||||
.map(|dt| dt.with_timezone(&Utc))
|
||||
}
|
||||
|
||||
#[cfg(feature = "docker")]
|
||||
mod docker {
|
||||
use std::collections::BTreeMap;
|
||||
|
|
@ -62,11 +69,12 @@ mod docker {
|
|||
use bollard::Docker;
|
||||
use bollard::container::InspectContainerOptions;
|
||||
use bollard::models::{ContainerInspectResponse, ContainerStateStatusEnum, HostConfig};
|
||||
use chrono::{DateTime, Utc};
|
||||
use fabro_types::{
|
||||
RunId, RunSandbox, SandboxDetails, SandboxResources, SandboxState, SandboxTimestamps,
|
||||
};
|
||||
|
||||
use super::parse_rfc3339_utc;
|
||||
|
||||
pub(super) async fn docker_details(
|
||||
record: &RunSandbox,
|
||||
_run_id: Option<RunId>,
|
||||
|
|
@ -116,7 +124,7 @@ mod docker {
|
|||
|
||||
let image = inspect.image;
|
||||
|
||||
let created_at = inspect.created.as_deref().and_then(parse_docker_timestamp);
|
||||
let created_at = inspect.created.as_deref().and_then(parse_rfc3339_utc);
|
||||
|
||||
SandboxDetails {
|
||||
sandbox: RunSandbox {
|
||||
|
|
@ -135,12 +143,6 @@ mod docker {
|
|||
}
|
||||
}
|
||||
|
||||
fn parse_docker_timestamp(value: &str) -> Option<DateTime<Utc>> {
|
||||
DateTime::parse_from_rfc3339(value)
|
||||
.ok()
|
||||
.map(|dt| dt.with_timezone(&Utc))
|
||||
}
|
||||
|
||||
pub(super) fn docker_cpu_cores(host_config: &HostConfig) -> Option<f64> {
|
||||
let quota = host_config.cpu_quota?;
|
||||
let period = host_config.cpu_period?;
|
||||
|
|
@ -324,13 +326,13 @@ mod docker {
|
|||
|
||||
#[test]
|
||||
fn parse_timestamp_accepts_rfc3339() {
|
||||
let parsed = parse_docker_timestamp("2026-05-09T12:00:00Z");
|
||||
let parsed = parse_rfc3339_utc("2026-05-09T12:00:00Z");
|
||||
assert!(parsed.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_timestamp_rejects_garbage() {
|
||||
assert!(parse_docker_timestamp("not a date").is_none());
|
||||
assert!(parse_rfc3339_utc("not a date").is_none());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -340,12 +342,12 @@ mod daytona {
|
|||
use std::collections::BTreeMap;
|
||||
|
||||
use anyhow::{Context, Result, anyhow};
|
||||
use chrono::{DateTime, Utc};
|
||||
use daytona_api_client::models::SandboxState as DaytonaState;
|
||||
use fabro_types::{
|
||||
RunSandbox, SandboxDetails, SandboxResources, SandboxState, SandboxTimestamps,
|
||||
};
|
||||
|
||||
use super::parse_rfc3339_utc;
|
||||
use crate::daytona::DaytonaSandbox;
|
||||
|
||||
pub(super) async fn daytona_details(
|
||||
|
|
@ -412,18 +414,12 @@ mod daytona {
|
|||
resources,
|
||||
labels,
|
||||
timestamps: SandboxTimestamps {
|
||||
created_at: sandbox.created_at.as_deref().and_then(parse_iso8601),
|
||||
last_activity_at: sandbox.updated_at.as_deref().and_then(parse_iso8601),
|
||||
created_at: sandbox.created_at.as_deref().and_then(parse_rfc3339_utc),
|
||||
last_activity_at: sandbox.updated_at.as_deref().and_then(parse_rfc3339_utc),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_iso8601(value: &str) -> Option<DateTime<Utc>> {
|
||||
DateTime::parse_from_rfc3339(value)
|
||||
.ok()
|
||||
.map(|dt| dt.with_timezone(&Utc))
|
||||
}
|
||||
|
||||
/// The Daytona SDK reports CPU/memory/disk as floats in their respective
|
||||
/// SI units (cores, GiB, GiB). Convert mem/disk into bytes.
|
||||
fn gibibytes_to_bytes(value: f64) -> Option<u64> {
|
||||
|
|
|
|||
|
|
@ -1036,33 +1036,33 @@ mod runs {
|
|||
) -> RunSummary {
|
||||
let created_at = ts(created_at);
|
||||
let run_id = RunId::with_timestamp(created_at, sequence);
|
||||
RunSummary::new(
|
||||
RunSummary::from_parts(RunParts {
|
||||
run_id,
|
||||
Some(workflow_name.into()),
|
||||
Some(workflow_slug.into()),
|
||||
goal.into(),
|
||||
fabro_types::infer_run_title(goal),
|
||||
labels(entries),
|
||||
Some(format!("/demo/{repo_name}")),
|
||||
Some(format!("https://github.com/demo/{repo_name}.git")),
|
||||
None,
|
||||
Some(created_at),
|
||||
Some(created_at),
|
||||
Some(created_at),
|
||||
parse_run_status(status, status_reason)
|
||||
workflow_name: Some(workflow_name.into()),
|
||||
workflow_slug: Some(workflow_slug.into()),
|
||||
goal: goal.into(),
|
||||
title: fabro_types::infer_run_title(goal),
|
||||
labels: labels(entries),
|
||||
source_directory: Some(format!("/demo/{repo_name}")),
|
||||
repo_origin_url: Some(format!("https://github.com/demo/{repo_name}.git")),
|
||||
created_by: None,
|
||||
start_time: Some(created_at),
|
||||
last_event_at: Some(created_at),
|
||||
completed_at: Some(created_at),
|
||||
status: parse_run_status(status, status_reason)
|
||||
.unwrap_or_else(|| panic!("invalid demo run status: {status}")),
|
||||
pending_control,
|
||||
elapsed_secs.and_then(duration_ms_from_secs),
|
||||
duration_ms: elapsed_secs.and_then(duration_ms_from_secs),
|
||||
total_usd_micros,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Vec::new(),
|
||||
None,
|
||||
None,
|
||||
)
|
||||
superseded_by: None,
|
||||
diff_summary: None,
|
||||
pull_request: None,
|
||||
archived_at: None,
|
||||
sandbox: None,
|
||||
models: Vec::new(),
|
||||
current_question: None,
|
||||
web_url: None,
|
||||
})
|
||||
}
|
||||
|
||||
fn parse_run_status(status: &str, status_reason: Option<&str>) -> Option<RunStatus> {
|
||||
|
|
|
|||
|
|
@ -33,11 +33,11 @@ pub use fabro_api::types::{
|
|||
PreviewUrlResponse, PruneRunEntry, PruneRunsRequest, PruneRunsResponse,
|
||||
RenderWorkflowGraphDirection, RenderWorkflowGraphRequest, RewindRequest, RewindResponse,
|
||||
RunArtifactEntry, RunArtifactListResponse, RunBilling, RunBillingStage, RunBillingTotals,
|
||||
RunError, RunManifest, RunStage, RunStatusResponse, SandboxDetails, SandboxFileEntry,
|
||||
SandboxFileListResponse, SandboxService, SandboxServiceListResponse, SshAccessRequest,
|
||||
SshAccessResponse, StageHandler, StageState, StartRunRequest, SubmitAnswerRequest,
|
||||
SystemFeatures, SystemInfoResponse, SystemRepairRunIssue, SystemRepairRunsResponse,
|
||||
SystemRunCounts, TimelineEntryResponse, VncPreviewResponse, WriteBlobResponse,
|
||||
RunError, RunManifest, RunStage, SandboxDetails, SandboxFileEntry, SandboxFileListResponse,
|
||||
SandboxService, SandboxServiceListResponse, SshAccessRequest, SshAccessResponse, StageHandler,
|
||||
StageState, StartRunRequest, SubmitAnswerRequest, SystemFeatures, SystemInfoResponse,
|
||||
SystemRepairRunIssue, SystemRepairRunsResponse, SystemRunCounts, TimelineEntryResponse,
|
||||
VncPreviewResponse, WriteBlobResponse,
|
||||
};
|
||||
use fabro_auth::{
|
||||
CredentialSource, VaultCredentialSource, auth_issue_message, parse_credential_secret,
|
||||
|
|
|
|||
|
|
@ -558,7 +558,7 @@ async fn list_sandbox_services(
|
|||
Ok(record) => record,
|
||||
Err(response) => return response,
|
||||
};
|
||||
let provider = record.provider.to_string();
|
||||
let provider = record.provider;
|
||||
let sandbox = match reconnect_run_sandbox(&state, &id).await {
|
||||
Ok(sandbox) => sandbox,
|
||||
Err(response) => return response,
|
||||
|
|
@ -586,7 +586,7 @@ async fn list_sandbox_services(
|
|||
.into_response();
|
||||
}
|
||||
|
||||
let discovery = parse_sandbox_services(&result.stdout, &provider);
|
||||
let discovery = parse_sandbox_services(&result.stdout, provider);
|
||||
Json(SandboxServiceListResponse {
|
||||
data: discovery.services,
|
||||
meta: SandboxServiceListMeta {
|
||||
|
|
@ -613,7 +613,7 @@ struct SandboxServiceDiscovery {
|
|||
source: SandboxServiceDiscoverySource,
|
||||
}
|
||||
|
||||
fn parse_sandbox_services(output: &str, provider: &str) -> SandboxServiceDiscovery {
|
||||
fn parse_sandbox_services(output: &str, provider: SandboxProvider) -> SandboxServiceDiscovery {
|
||||
if output
|
||||
.lines()
|
||||
.any(|line| line.trim_start().starts_with("FABRO_PROC_NET_TCP "))
|
||||
|
|
@ -630,7 +630,7 @@ fn parse_sandbox_services(output: &str, provider: &str) -> SandboxServiceDiscove
|
|||
}
|
||||
}
|
||||
|
||||
fn parse_ss_listening_services(output: &str, provider: &str) -> Vec<SandboxService> {
|
||||
fn parse_ss_listening_services(output: &str, provider: SandboxProvider) -> Vec<SandboxService> {
|
||||
let mut services = BTreeMap::<u16, SandboxService>::new();
|
||||
for line in output
|
||||
.lines()
|
||||
|
|
@ -661,7 +661,10 @@ enum ProcNetFamily {
|
|||
Ipv6,
|
||||
}
|
||||
|
||||
fn parse_proc_net_listening_services(output: &str, provider: &str) -> Vec<SandboxService> {
|
||||
fn parse_proc_net_listening_services(
|
||||
output: &str,
|
||||
provider: SandboxProvider,
|
||||
) -> Vec<SandboxService> {
|
||||
let mut services = BTreeMap::<u16, SandboxService>::new();
|
||||
let mut family = None;
|
||||
for line in output
|
||||
|
|
@ -740,7 +743,7 @@ fn parse_proc_net_ipv6(value: &str) -> Option<Ipv6Addr> {
|
|||
|
||||
fn push_service(
|
||||
services: &mut BTreeMap<u16, SandboxService>,
|
||||
provider: &str,
|
||||
provider: SandboxProvider,
|
||||
port: u16,
|
||||
address: String,
|
||||
process: Option<String>,
|
||||
|
|
@ -757,8 +760,8 @@ fn push_service(
|
|||
}
|
||||
}
|
||||
|
||||
fn preview_supported(provider: &str, port: u16) -> bool {
|
||||
provider == SandboxProvider::Daytona.to_string() && (3000..=9999).contains(&port)
|
||||
fn preview_supported(provider: SandboxProvider, port: u16) -> bool {
|
||||
provider == SandboxProvider::Daytona && (3000..=9999).contains(&port)
|
||||
}
|
||||
|
||||
fn push_unique(values: &mut Vec<String>, value: String) {
|
||||
|
|
@ -997,7 +1000,7 @@ LISTEN 0 4096 0.0.0.0:5173 0.0.0.0:* users:(("vite",pid=84,fd=19))
|
|||
LISTEN 0 4096 [::]:8080 [::]:* users:(("server",pid=126,fd=9))
|
||||
LISTEN 0 4096 [::1]:2500 [::]:* users:(("debug",pid=168,fd=7))
|
||||
"#,
|
||||
"daytona",
|
||||
SandboxProvider::Daytona,
|
||||
);
|
||||
|
||||
assert_eq!(services.len(), 4);
|
||||
|
|
@ -1031,7 +1034,7 @@ not enough fields
|
|||
LISTEN 0 4096 127.0.0.1:0 0.0.0.0:* users:(("zero",pid=1,fd=2))
|
||||
LISTEN 0 4096 127.0.0.1:65536 0.0.0.0:* users:(("large",pid=1,fd=2))
|
||||
"#,
|
||||
"daytona",
|
||||
SandboxProvider::Daytona,
|
||||
);
|
||||
|
||||
assert!(services.is_empty());
|
||||
|
|
@ -1046,7 +1049,7 @@ LISTEN 0 4096 0.0.0.0:3000 0.0.0.0:* users:(("node",pid=42,fd=23))
|
|||
LISTEN 0 4096 127.0.0.1:3000 0.0.0.0:* users:(("node",pid=42,fd=23))
|
||||
LISTEN 0 4096 [::]:3000 [::]:* users:(("vite",pid=84,fd=19))
|
||||
"#,
|
||||
"daytona",
|
||||
SandboxProvider::Daytona,
|
||||
);
|
||||
|
||||
assert_eq!(services, vec![SandboxService {
|
||||
|
|
@ -1078,7 +1081,7 @@ FABRO_PROC_NET_TCP /proc/net/tcp6
|
|||
0: 00000000000000000000000000000000:1F90 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 501 0 44444
|
||||
1: 00000000000000000000000001000000:09C4 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 501 0 55555
|
||||
",
|
||||
"daytona",
|
||||
SandboxProvider::Daytona,
|
||||
);
|
||||
|
||||
assert_eq!(discovery.source, SandboxServiceDiscoverySource::Procfs);
|
||||
|
|
@ -1112,11 +1115,11 @@ FABRO_PROC_NET_TCP /proc/net/tcp6
|
|||
|
||||
#[test]
|
||||
fn preview_support_is_daytona_only_for_documented_range() {
|
||||
assert!(!preview_supported("daytona", 2500));
|
||||
assert!(preview_supported("daytona", 3000));
|
||||
assert!(preview_supported("daytona", 9999));
|
||||
assert!(!preview_supported("daytona", 10000));
|
||||
assert!(!preview_supported("docker", 3000));
|
||||
assert!(!preview_supported(SandboxProvider::Daytona, 2500));
|
||||
assert!(preview_supported(SandboxProvider::Daytona, 3000));
|
||||
assert!(preview_supported(SandboxProvider::Daytona, 9999));
|
||||
assert!(!preview_supported(SandboxProvider::Daytona, 10000));
|
||||
assert!(!preview_supported(SandboxProvider::Docker, 3000));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
|
|
@ -1005,11 +1005,11 @@ async fn delete_auth_session(
|
|||
.into_response();
|
||||
}
|
||||
};
|
||||
let active_sessions = match auth_tokens
|
||||
.active_cli_sessions(&authenticated.principal.identity, Utc::now())
|
||||
let deleted = match auth_tokens
|
||||
.delete_active_chain_for_identity(&authenticated.principal.identity, chain_id, Utc::now())
|
||||
.await
|
||||
{
|
||||
Ok(tokens) => tokens,
|
||||
Ok(deleted) => deleted,
|
||||
Err(err) => {
|
||||
error!(error = %err, "Failed to scan refresh tokens while deleting auth session");
|
||||
return ApiError::new(
|
||||
|
|
@ -1019,23 +1019,10 @@ async fn delete_auth_session(
|
|||
.into_response();
|
||||
}
|
||||
};
|
||||
|
||||
if !active_sessions
|
||||
.iter()
|
||||
.any(|token| token.chain_id == chain_id)
|
||||
{
|
||||
if deleted == 0 {
|
||||
return ApiError::not_found("Auth session not found.").into_response();
|
||||
}
|
||||
|
||||
if let Err(err) = auth_tokens.delete_chain(chain_id).await {
|
||||
error!(error = %err, %chain_id, "Failed to delete refresh token chain");
|
||||
return ApiError::new(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"Failed to revoke auth session.",
|
||||
)
|
||||
.into_response();
|
||||
}
|
||||
|
||||
StatusCode::NO_CONTENT.into_response()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ use fabro_types::settings::run::RunSandboxSettings;
|
|||
use fabro_types::{
|
||||
BilledModelUsage, Checkpoint, CheckpointRecord, CommandTermination, Conclusion, EventBody,
|
||||
FailureSignature, InterviewQuestionRecord, Outcome, PendingInterviewRecord, PullRequestRecord,
|
||||
RunControlAction, RunDiff, RunEvent, RunId, RunModel, RunProjection, RunSandbox,
|
||||
RunControlAction, RunDiff, RunEvent, RunId, RunModel, RunParts, RunProjection, RunSandbox,
|
||||
RunSandboxRuntime, RunSpec, RunStatus, RunSummary, SandboxProvider, StageCompletion,
|
||||
StageHandler, StageId, StageOutcome, StageProjection, StageState, StartRecord, first_event_seq,
|
||||
};
|
||||
|
|
@ -600,42 +600,42 @@ pub(crate) fn build_summary(state: &RunProjection, run_id: &RunId) -> RunSummary
|
|||
.as_ref()
|
||||
.and_then(|provenance| provenance.subject.clone());
|
||||
|
||||
RunSummary::new(
|
||||
*run_id,
|
||||
RunSummary::from_parts(RunParts {
|
||||
run_id: *run_id,
|
||||
workflow_name,
|
||||
state.spec.workflow_slug.clone(),
|
||||
workflow_slug: state.spec.workflow_slug.clone(),
|
||||
goal,
|
||||
state.title().into_owned(),
|
||||
state.spec.labels.clone(),
|
||||
state.spec.source_directory.clone(),
|
||||
state.spec.git.as_ref().map(|git| git.origin_url.clone()),
|
||||
title: state.title().into_owned(),
|
||||
labels: state.spec.labels.clone(),
|
||||
source_directory: state.spec.source_directory.clone(),
|
||||
repo_origin_url: state.spec.git.as_ref().map(|git| git.origin_url.clone()),
|
||||
created_by,
|
||||
state.start.as_ref().map(|start| start.start_time),
|
||||
Some(state.last_event_at),
|
||||
state
|
||||
start_time: state.start.as_ref().map(|start| start.start_time),
|
||||
last_event_at: Some(state.last_event_at),
|
||||
completed_at: state
|
||||
.conclusion
|
||||
.as_ref()
|
||||
.map(|conclusion| conclusion.timestamp),
|
||||
state.status,
|
||||
state.pending_control,
|
||||
state
|
||||
status: state.status,
|
||||
pending_control: state.pending_control,
|
||||
duration_ms: state
|
||||
.conclusion
|
||||
.as_ref()
|
||||
.map(|conclusion| conclusion.duration_ms),
|
||||
state
|
||||
total_usd_micros: state
|
||||
.conclusion
|
||||
.as_ref()
|
||||
.and_then(|conclusion| conclusion.billing.as_ref())
|
||||
.and_then(|billing| billing.total_usd_micros),
|
||||
state.superseded_by,
|
||||
superseded_by: state.superseded_by,
|
||||
diff_summary,
|
||||
state.pull_request.clone(),
|
||||
state.archived_at,
|
||||
state.sandbox.clone(),
|
||||
pull_request: state.pull_request.clone(),
|
||||
archived_at: state.archived_at,
|
||||
sandbox: state.sandbox.clone(),
|
||||
models,
|
||||
current_question,
|
||||
state.web_url.clone(),
|
||||
)
|
||||
web_url: state.web_url.clone(),
|
||||
})
|
||||
}
|
||||
|
||||
fn run_models(state: &RunProjection) -> Vec<RunModel> {
|
||||
|
|
|
|||
|
|
@ -141,6 +141,42 @@ impl RefreshTokenStore {
|
|||
self.repo.gc(|token| token.chain_id == chain_id).await
|
||||
}
|
||||
|
||||
pub async fn delete_active_chain_for_identity(
|
||||
&self,
|
||||
identity: &IdpIdentity,
|
||||
chain_id: Uuid,
|
||||
now: DateTime<Utc>,
|
||||
) -> Result<u64> {
|
||||
let mut token_hashes = Vec::new();
|
||||
let mut has_active_token = false;
|
||||
let mut tokens = self.repo.scan_stream();
|
||||
|
||||
while let Some(result) = tokens.next().await {
|
||||
let (_, token) = result?;
|
||||
if token.identity != *identity || token.chain_id != chain_id {
|
||||
continue;
|
||||
}
|
||||
if !token.used && token.expires_at > now {
|
||||
has_active_token = true;
|
||||
}
|
||||
token_hashes.push(token.token_hash);
|
||||
}
|
||||
|
||||
if !has_active_token {
|
||||
return Ok(0);
|
||||
}
|
||||
|
||||
let deleted = u64::try_from(token_hashes.len()).unwrap_or(u64::MAX);
|
||||
transaction(&self.db, |tx| {
|
||||
for token_hash in &token_hashes {
|
||||
tx.delete::<RefreshToken>(token_hash)?;
|
||||
}
|
||||
Ok(())
|
||||
})
|
||||
.await?;
|
||||
Ok(deleted)
|
||||
}
|
||||
|
||||
pub async fn gc_expired(&self, cutoff: DateTime<Utc>) -> Result<u64> {
|
||||
self.repo.gc(|token| token.expires_at <= cutoff).await
|
||||
}
|
||||
|
|
@ -365,6 +401,85 @@ mod tests {
|
|||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn delete_active_chain_for_identity_requires_active_owned_token() {
|
||||
let store = store().await;
|
||||
let identity = fabro_types::IdpIdentity::new("https://github.com", "12345").unwrap();
|
||||
let chain_id = Uuid::new_v4();
|
||||
let other_chain_id = Uuid::new_v4();
|
||||
let active = refresh_token([1_u8; 32], chain_id, false);
|
||||
let used = refresh_token([2_u8; 32], chain_id, true);
|
||||
let mut other_identity = refresh_token([3_u8; 32], chain_id, false);
|
||||
other_identity.identity = alternate_identity();
|
||||
let other_chain = refresh_token([4_u8; 32], other_chain_id, false);
|
||||
|
||||
for token in [
|
||||
active.clone(),
|
||||
used.clone(),
|
||||
other_identity.clone(),
|
||||
other_chain.clone(),
|
||||
] {
|
||||
store.insert_refresh_token(token).await.unwrap();
|
||||
}
|
||||
|
||||
assert_eq!(
|
||||
store
|
||||
.delete_active_chain_for_identity(&identity, chain_id, chrono::Utc::now())
|
||||
.await
|
||||
.unwrap(),
|
||||
2
|
||||
);
|
||||
assert!(
|
||||
store
|
||||
.find_refresh_token(&active.token_hash)
|
||||
.await
|
||||
.unwrap()
|
||||
.is_none()
|
||||
);
|
||||
assert!(
|
||||
store
|
||||
.find_refresh_token(&used.token_hash)
|
||||
.await
|
||||
.unwrap()
|
||||
.is_none()
|
||||
);
|
||||
assert_eq!(
|
||||
store
|
||||
.find_refresh_token(&other_identity.token_hash)
|
||||
.await
|
||||
.unwrap(),
|
||||
Some(other_identity)
|
||||
);
|
||||
assert_eq!(
|
||||
store
|
||||
.find_refresh_token(&other_chain.token_hash)
|
||||
.await
|
||||
.unwrap(),
|
||||
Some(other_chain)
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn delete_active_chain_for_identity_returns_zero_without_active_token() {
|
||||
let store = store().await;
|
||||
let identity = fabro_types::IdpIdentity::new("https://github.com", "12345").unwrap();
|
||||
let chain_id = Uuid::new_v4();
|
||||
let used = refresh_token([1_u8; 32], chain_id, true);
|
||||
store.insert_refresh_token(used.clone()).await.unwrap();
|
||||
|
||||
assert_eq!(
|
||||
store
|
||||
.delete_active_chain_for_identity(&identity, chain_id, chrono::Utc::now())
|
||||
.await
|
||||
.unwrap(),
|
||||
0
|
||||
);
|
||||
assert_eq!(
|
||||
store.find_refresh_token(&used.token_hash).await.unwrap(),
|
||||
Some(used)
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn active_cli_sessions_return_newest_active_token_per_chain_for_identity() {
|
||||
let store = store().await;
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ pub use run_projection::{
|
|||
pub use run_sandbox::{RunSandbox, RunSandboxRuntime};
|
||||
pub use run_summary::{
|
||||
AutomationRef, Run, RunBillingSummary, RunError, RunLifecycle, RunLinks, RunModel, RunOrigin,
|
||||
RunOriginKind, RunTimestamps, WorkflowRef,
|
||||
RunOriginKind, RunParts, RunTimestamps, WorkflowRef,
|
||||
};
|
||||
pub type RunSummary = Run;
|
||||
pub type PullRequestRecord = PullRequest;
|
||||
|
|
|
|||
|
|
@ -69,6 +69,34 @@ pub struct Run {
|
|||
pub diff_summary: Option<DiffSummary>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub struct RunParts {
|
||||
pub run_id: RunId,
|
||||
pub workflow_name: Option<String>,
|
||||
pub workflow_slug: Option<String>,
|
||||
pub goal: String,
|
||||
pub title: String,
|
||||
pub labels: HashMap<String, String>,
|
||||
pub source_directory: Option<String>,
|
||||
pub repo_origin_url: Option<String>,
|
||||
pub created_by: Option<Principal>,
|
||||
pub start_time: Option<DateTime<Utc>>,
|
||||
pub last_event_at: Option<DateTime<Utc>>,
|
||||
pub completed_at: Option<DateTime<Utc>>,
|
||||
pub status: RunStatus,
|
||||
pub pending_control: Option<RunControlAction>,
|
||||
pub duration_ms: Option<u64>,
|
||||
pub total_usd_micros: Option<i64>,
|
||||
pub superseded_by: Option<RunId>,
|
||||
pub diff_summary: Option<DiffSummary>,
|
||||
pub pull_request: Option<PullRequest>,
|
||||
pub archived_at: Option<DateTime<Utc>>,
|
||||
pub sandbox: Option<RunSandbox>,
|
||||
pub models: Vec<RunModel>,
|
||||
pub current_question: Option<InterviewQuestionRecord>,
|
||||
pub web_url: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
struct RunWire {
|
||||
#[serde(default)]
|
||||
|
|
@ -369,36 +397,33 @@ pub struct RunLinks {
|
|||
}
|
||||
|
||||
impl Run {
|
||||
#[allow(
|
||||
clippy::too_many_arguments,
|
||||
reason = "Run is a public wire DTO; the constructor centralizes derived fields."
|
||||
)]
|
||||
pub fn new(
|
||||
run_id: RunId,
|
||||
workflow_name: Option<String>,
|
||||
workflow_slug: Option<String>,
|
||||
goal: String,
|
||||
title: String,
|
||||
labels: HashMap<String, String>,
|
||||
source_directory: Option<String>,
|
||||
repo_origin_url: Option<String>,
|
||||
created_by: Option<Principal>,
|
||||
start_time: Option<DateTime<Utc>>,
|
||||
last_event_at: Option<DateTime<Utc>>,
|
||||
completed_at: Option<DateTime<Utc>>,
|
||||
status: RunStatus,
|
||||
pending_control: Option<RunControlAction>,
|
||||
duration_ms: Option<u64>,
|
||||
total_usd_micros: Option<i64>,
|
||||
superseded_by: Option<RunId>,
|
||||
diff_summary: Option<DiffSummary>,
|
||||
pull_request: Option<PullRequest>,
|
||||
archived_at: Option<DateTime<Utc>>,
|
||||
sandbox: Option<RunSandbox>,
|
||||
models: Vec<RunModel>,
|
||||
current_question: Option<InterviewQuestionRecord>,
|
||||
web_url: Option<String>,
|
||||
) -> Self {
|
||||
pub fn from_parts(parts: RunParts) -> Self {
|
||||
let RunParts {
|
||||
run_id,
|
||||
workflow_name,
|
||||
workflow_slug,
|
||||
goal,
|
||||
title,
|
||||
labels,
|
||||
source_directory,
|
||||
repo_origin_url,
|
||||
created_by,
|
||||
start_time,
|
||||
last_event_at,
|
||||
completed_at,
|
||||
status,
|
||||
pending_control,
|
||||
duration_ms,
|
||||
total_usd_micros,
|
||||
superseded_by,
|
||||
diff_summary,
|
||||
pull_request,
|
||||
archived_at,
|
||||
sandbox,
|
||||
models,
|
||||
current_question,
|
||||
web_url,
|
||||
} = parts;
|
||||
let created_at = run_id.created_at();
|
||||
let repository = Some(repository_ref(
|
||||
repo_origin_url.as_deref(),
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -45,7 +45,7 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
/**
|
||||
* Revokes an active CLI session chain. Browser sessions are not revocable in this API version.
|
||||
* @summary Revoke an authenticated session
|
||||
* @param {string} id
|
||||
* @param {string} id
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -187,7 +187,7 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
/**
|
||||
* Creates a browser session from an enabled development token.
|
||||
* @summary Login with development token
|
||||
* @param {DevTokenLoginRequest} devTokenLoginRequest
|
||||
* @param {DevTokenLoginRequest} devTokenLoginRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -222,7 +222,7 @@ export const AuthApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
/**
|
||||
* Enables or disables demo-mode routing for the current browser session.
|
||||
* @summary Toggle browser demo mode
|
||||
* @param {DemoToggleRequest} demoToggleRequest
|
||||
* @param {DemoToggleRequest} demoToggleRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -272,7 +272,7 @@ export const AuthApiFp = function(configuration?: Configuration) {
|
|||
/**
|
||||
* Revokes an active CLI session chain. Browser sessions are not revocable in this API version.
|
||||
* @summary Revoke an authenticated session
|
||||
* @param {string} id
|
||||
* @param {string} id
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -321,7 +321,7 @@ export const AuthApiFp = function(configuration?: Configuration) {
|
|||
/**
|
||||
* Creates a browser session from an enabled development token.
|
||||
* @summary Login with development token
|
||||
* @param {DevTokenLoginRequest} devTokenLoginRequest
|
||||
* @param {DevTokenLoginRequest} devTokenLoginRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -334,7 +334,7 @@ export const AuthApiFp = function(configuration?: Configuration) {
|
|||
/**
|
||||
* Enables or disables demo-mode routing for the current browser session.
|
||||
* @summary Toggle browser demo mode
|
||||
* @param {DemoToggleRequest} demoToggleRequest
|
||||
* @param {DemoToggleRequest} demoToggleRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -356,7 +356,7 @@ export const AuthApiFactory = function (configuration?: Configuration, basePath?
|
|||
/**
|
||||
* Revokes an active CLI session chain. Browser sessions are not revocable in this API version.
|
||||
* @summary Revoke an authenticated session
|
||||
* @param {string} id
|
||||
* @param {string} id
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -393,7 +393,7 @@ export const AuthApiFactory = function (configuration?: Configuration, basePath?
|
|||
/**
|
||||
* Creates a browser session from an enabled development token.
|
||||
* @summary Login with development token
|
||||
* @param {DevTokenLoginRequest} devTokenLoginRequest
|
||||
* @param {DevTokenLoginRequest} devTokenLoginRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -403,7 +403,7 @@ export const AuthApiFactory = function (configuration?: Configuration, basePath?
|
|||
/**
|
||||
* Enables or disables demo-mode routing for the current browser session.
|
||||
* @summary Toggle browser demo mode
|
||||
* @param {DemoToggleRequest} demoToggleRequest
|
||||
* @param {DemoToggleRequest} demoToggleRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -420,7 +420,7 @@ export class AuthApi extends BaseAPI {
|
|||
/**
|
||||
* Revokes an active CLI session chain. Browser sessions are not revocable in this API version.
|
||||
* @summary Revoke an authenticated session
|
||||
* @param {string} id
|
||||
* @param {string} id
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -461,7 +461,7 @@ export class AuthApi extends BaseAPI {
|
|||
/**
|
||||
* Creates a browser session from an enabled development token.
|
||||
* @summary Login with development token
|
||||
* @param {DevTokenLoginRequest} devTokenLoginRequest
|
||||
* @param {DevTokenLoginRequest} devTokenLoginRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -472,7 +472,7 @@ export class AuthApi extends BaseAPI {
|
|||
/**
|
||||
* Enables or disables demo-mode routing for the current browser session.
|
||||
* @summary Toggle browser demo mode
|
||||
* @param {DemoToggleRequest} demoToggleRequest
|
||||
* @param {DemoToggleRequest} demoToggleRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -480,4 +480,3 @@ export class AuthApi extends BaseAPI {
|
|||
return AuthApiFp(this.configuration).toggleDemo(demoToggleRequest, options).then((request) => request(this.axios, this.basePath));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -54,7 +54,7 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
|
|||
* Creates a command for connecting to the run\'s sandbox environment. Daytona runs return a time-limited SSH command; Docker runs return a local docker exec command.
|
||||
* @summary Sandbox Access Command
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {SshAccessRequest} sshAccessRequest
|
||||
* @param {SshAccessRequest} sshAccessRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -139,7 +139,7 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
|
|||
* Generates a preview URL for a port exposed by the run\'s sandbox environment.
|
||||
* @summary Preview URL
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {PreviewUrlRequest} previewUrlRequest
|
||||
* @param {PreviewUrlRequest} previewUrlRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -184,7 +184,7 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
|
|||
* Downloads a file from the run\'s sandbox environment.
|
||||
* @summary Download Sandbox File
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {string} path
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -228,7 +228,7 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
|
|||
};
|
||||
},
|
||||
/**
|
||||
* Interrupt the active API-mode agent round without sending steering text. The agent keeps its steering lease and waits for a later steer message before starting another LLM round.
|
||||
* Interrupt the active API-mode agent round without sending steering text. The agent keeps its steering lease and waits for a later steer message before starting another LLM round.
|
||||
* @summary Interrupt Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -321,8 +321,8 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
|
|||
* Lists directory entries from the run\'s sandbox environment.
|
||||
* @summary List Sandbox Files
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {number} [depth]
|
||||
* @param {string} path
|
||||
* @param {number} [depth]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -413,8 +413,8 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
|
|||
* Uploads a file into the run\'s sandbox environment.
|
||||
* @summary Upload Sandbox File
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {File} body
|
||||
* @param {string} path
|
||||
* @param {File} body
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -502,10 +502,10 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
|
|||
};
|
||||
},
|
||||
/**
|
||||
* Send a mid-run steering message to the live agent session(s) of a running run. Set `interrupt=true` to atomically interrupt the active API-mode agent round first, then deliver this message as the next user turn. Without `interrupt=true`, the message is appended to the steering queue and may buffer until the next API-mode agent session.
|
||||
* Send a mid-run steering message to the live agent session(s) of a running run. Set `interrupt=true` to atomically interrupt the active API-mode agent round first, then deliver this message as the next user turn. Without `interrupt=true`, the message is appended to the steering queue and may buffer until the next API-mode agent session.
|
||||
* @summary Steer Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {SteerRunRequest} steerRunRequest
|
||||
* @param {SteerRunRequest} steerRunRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -551,7 +551,7 @@ export const HumanInTheLoopApiAxiosParamCreator = function (configuration?: Conf
|
|||
* @summary Submit Run Answer
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} qid Unique identifier of a pending question.
|
||||
* @param {SubmitAnswerRequest} submitAnswerRequest
|
||||
* @param {SubmitAnswerRequest} submitAnswerRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -608,7 +608,7 @@ export const HumanInTheLoopApiFp = function(configuration?: Configuration) {
|
|||
* Creates a command for connecting to the run\'s sandbox environment. Daytona runs return a time-limited SSH command; Docker runs return a local docker exec command.
|
||||
* @summary Sandbox Access Command
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {SshAccessRequest} sshAccessRequest
|
||||
* @param {SshAccessRequest} sshAccessRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -635,7 +635,7 @@ export const HumanInTheLoopApiFp = function(configuration?: Configuration) {
|
|||
* Generates a preview URL for a port exposed by the run\'s sandbox environment.
|
||||
* @summary Preview URL
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {PreviewUrlRequest} previewUrlRequest
|
||||
* @param {PreviewUrlRequest} previewUrlRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -649,7 +649,7 @@ export const HumanInTheLoopApiFp = function(configuration?: Configuration) {
|
|||
* Downloads a file from the run\'s sandbox environment.
|
||||
* @summary Download Sandbox File
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {string} path
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -660,7 +660,7 @@ export const HumanInTheLoopApiFp = function(configuration?: Configuration) {
|
|||
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
|
||||
},
|
||||
/**
|
||||
* Interrupt the active API-mode agent round without sending steering text. The agent keeps its steering lease and waits for a later steer message before starting another LLM round.
|
||||
* Interrupt the active API-mode agent round without sending steering text. The agent keeps its steering lease and waits for a later steer message before starting another LLM round.
|
||||
* @summary Interrupt Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -691,8 +691,8 @@ export const HumanInTheLoopApiFp = function(configuration?: Configuration) {
|
|||
* Lists directory entries from the run\'s sandbox environment.
|
||||
* @summary List Sandbox Files
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {number} [depth]
|
||||
* @param {string} path
|
||||
* @param {number} [depth]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -719,8 +719,8 @@ export const HumanInTheLoopApiFp = function(configuration?: Configuration) {
|
|||
* Uploads a file into the run\'s sandbox environment.
|
||||
* @summary Upload Sandbox File
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {File} body
|
||||
* @param {string} path
|
||||
* @param {File} body
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -744,10 +744,10 @@ export const HumanInTheLoopApiFp = function(configuration?: Configuration) {
|
|||
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
|
||||
},
|
||||
/**
|
||||
* Send a mid-run steering message to the live agent session(s) of a running run. Set `interrupt=true` to atomically interrupt the active API-mode agent round first, then deliver this message as the next user turn. Without `interrupt=true`, the message is appended to the steering queue and may buffer until the next API-mode agent session.
|
||||
* Send a mid-run steering message to the live agent session(s) of a running run. Set `interrupt=true` to atomically interrupt the active API-mode agent round first, then deliver this message as the next user turn. Without `interrupt=true`, the message is appended to the steering queue and may buffer until the next API-mode agent session.
|
||||
* @summary Steer Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {SteerRunRequest} steerRunRequest
|
||||
* @param {SteerRunRequest} steerRunRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -762,7 +762,7 @@ export const HumanInTheLoopApiFp = function(configuration?: Configuration) {
|
|||
* @summary Submit Run Answer
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} qid Unique identifier of a pending question.
|
||||
* @param {SubmitAnswerRequest} submitAnswerRequest
|
||||
* @param {SubmitAnswerRequest} submitAnswerRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -785,7 +785,7 @@ export const HumanInTheLoopApiFactory = function (configuration?: Configuration,
|
|||
* Creates a command for connecting to the run\'s sandbox environment. Daytona runs return a time-limited SSH command; Docker runs return a local docker exec command.
|
||||
* @summary Sandbox Access Command
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {SshAccessRequest} sshAccessRequest
|
||||
* @param {SshAccessRequest} sshAccessRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -806,7 +806,7 @@ export const HumanInTheLoopApiFactory = function (configuration?: Configuration,
|
|||
* Generates a preview URL for a port exposed by the run\'s sandbox environment.
|
||||
* @summary Preview URL
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {PreviewUrlRequest} previewUrlRequest
|
||||
* @param {PreviewUrlRequest} previewUrlRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -817,7 +817,7 @@ export const HumanInTheLoopApiFactory = function (configuration?: Configuration,
|
|||
* Downloads a file from the run\'s sandbox environment.
|
||||
* @summary Download Sandbox File
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {string} path
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -825,7 +825,7 @@ export const HumanInTheLoopApiFactory = function (configuration?: Configuration,
|
|||
return localVarFp.getSandboxFile(id, path, options).then((request) => request(axios, basePath));
|
||||
},
|
||||
/**
|
||||
* Interrupt the active API-mode agent round without sending steering text. The agent keeps its steering lease and waits for a later steer message before starting another LLM round.
|
||||
* Interrupt the active API-mode agent round without sending steering text. The agent keeps its steering lease and waits for a later steer message before starting another LLM round.
|
||||
* @summary Interrupt Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -850,8 +850,8 @@ export const HumanInTheLoopApiFactory = function (configuration?: Configuration,
|
|||
* Lists directory entries from the run\'s sandbox environment.
|
||||
* @summary List Sandbox Files
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {number} [depth]
|
||||
* @param {string} path
|
||||
* @param {number} [depth]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -872,8 +872,8 @@ export const HumanInTheLoopApiFactory = function (configuration?: Configuration,
|
|||
* Uploads a file into the run\'s sandbox environment.
|
||||
* @summary Upload Sandbox File
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {File} body
|
||||
* @param {string} path
|
||||
* @param {File} body
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -891,10 +891,10 @@ export const HumanInTheLoopApiFactory = function (configuration?: Configuration,
|
|||
return localVarFp.retrieveRunSandbox(id, options).then((request) => request(axios, basePath));
|
||||
},
|
||||
/**
|
||||
* Send a mid-run steering message to the live agent session(s) of a running run. Set `interrupt=true` to atomically interrupt the active API-mode agent round first, then deliver this message as the next user turn. Without `interrupt=true`, the message is appended to the steering queue and may buffer until the next API-mode agent session.
|
||||
* Send a mid-run steering message to the live agent session(s) of a running run. Set `interrupt=true` to atomically interrupt the active API-mode agent round first, then deliver this message as the next user turn. Without `interrupt=true`, the message is appended to the steering queue and may buffer until the next API-mode agent session.
|
||||
* @summary Steer Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {SteerRunRequest} steerRunRequest
|
||||
* @param {SteerRunRequest} steerRunRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -906,7 +906,7 @@ export const HumanInTheLoopApiFactory = function (configuration?: Configuration,
|
|||
* @summary Submit Run Answer
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} qid Unique identifier of a pending question.
|
||||
* @param {SubmitAnswerRequest} submitAnswerRequest
|
||||
* @param {SubmitAnswerRequest} submitAnswerRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -924,7 +924,7 @@ export class HumanInTheLoopApi extends BaseAPI {
|
|||
* Creates a command for connecting to the run\'s sandbox environment. Daytona runs return a time-limited SSH command; Docker runs return a local docker exec command.
|
||||
* @summary Sandbox Access Command
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {SshAccessRequest} sshAccessRequest
|
||||
* @param {SshAccessRequest} sshAccessRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -947,7 +947,7 @@ export class HumanInTheLoopApi extends BaseAPI {
|
|||
* Generates a preview URL for a port exposed by the run\'s sandbox environment.
|
||||
* @summary Preview URL
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {PreviewUrlRequest} previewUrlRequest
|
||||
* @param {PreviewUrlRequest} previewUrlRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -959,7 +959,7 @@ export class HumanInTheLoopApi extends BaseAPI {
|
|||
* Downloads a file from the run\'s sandbox environment.
|
||||
* @summary Download Sandbox File
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {string} path
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -968,7 +968,7 @@ export class HumanInTheLoopApi extends BaseAPI {
|
|||
}
|
||||
|
||||
/**
|
||||
* Interrupt the active API-mode agent round without sending steering text. The agent keeps its steering lease and waits for a later steer message before starting another LLM round.
|
||||
* Interrupt the active API-mode agent round without sending steering text. The agent keeps its steering lease and waits for a later steer message before starting another LLM round.
|
||||
* @summary Interrupt Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -995,8 +995,8 @@ export class HumanInTheLoopApi extends BaseAPI {
|
|||
* Lists directory entries from the run\'s sandbox environment.
|
||||
* @summary List Sandbox Files
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {number} [depth]
|
||||
* @param {string} path
|
||||
* @param {number} [depth]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1019,8 +1019,8 @@ export class HumanInTheLoopApi extends BaseAPI {
|
|||
* Uploads a file into the run\'s sandbox environment.
|
||||
* @summary Upload Sandbox File
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} path
|
||||
* @param {File} body
|
||||
* @param {string} path
|
||||
* @param {File} body
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1040,10 +1040,10 @@ export class HumanInTheLoopApi extends BaseAPI {
|
|||
}
|
||||
|
||||
/**
|
||||
* Send a mid-run steering message to the live agent session(s) of a running run. Set `interrupt=true` to atomically interrupt the active API-mode agent round first, then deliver this message as the next user turn. Without `interrupt=true`, the message is appended to the steering queue and may buffer until the next API-mode agent session.
|
||||
* Send a mid-run steering message to the live agent session(s) of a running run. Set `interrupt=true` to atomically interrupt the active API-mode agent round first, then deliver this message as the next user turn. Without `interrupt=true`, the message is appended to the steering queue and may buffer until the next API-mode agent session.
|
||||
* @summary Steer Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {SteerRunRequest} steerRunRequest
|
||||
* @param {SteerRunRequest} steerRunRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1056,7 +1056,7 @@ export class HumanInTheLoopApi extends BaseAPI {
|
|||
* @summary Submit Run Answer
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {string} qid Unique identifier of a pending question.
|
||||
* @param {SubmitAnswerRequest} submitAnswerRequest
|
||||
* @param {SubmitAnswerRequest} submitAnswerRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1064,4 +1064,3 @@ export class HumanInTheLoopApi extends BaseAPI {
|
|||
return HumanInTheLoopApiFp(this.configuration).submitRunAnswer(id, qid, submitAnswerRequest, options).then((request) => request(this.axios, this.basePath));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -35,7 +35,7 @@ import type { RunBilling } from '../models';
|
|||
export const RunOutputsApiAxiosParamCreator = function (configuration?: Configuration) {
|
||||
return {
|
||||
/**
|
||||
* Returns commits on the run branch since the run\'s base SHA, sourced directly from sandbox Git. The list uses first-parent chronological history and is capped by `limit` (default and maximum: 100). Commit data is Git-authoritative; Fabro-generated commit messages are not required for correctness.
|
||||
* Returns commits on the run branch since the run\'s base SHA, sourced directly from sandbox Git. The list uses first-parent chronological history and is capped by `limit` (default and maximum: 100). Commit data is Git-authoritative; Fabro-generated commit messages are not required for correctness.
|
||||
* @summary List Run Commits
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {number} [limit] Maximum number of commits to return. Defaults to 100 and is capped at 100.
|
||||
|
|
@ -80,7 +80,7 @@ export const RunOutputsApiAxiosParamCreator = function (configuration?: Configur
|
|||
};
|
||||
},
|
||||
/**
|
||||
* Returns the set of file changes produced by a run as a list of before/after diffs. While the run\'s sandbox is reachable, diffs are resolved live against the sandbox working tree at the current HEAD. Degraded responses keep the same `data: FileDiff[]` shape. File contents are null on every entry; non-sensitive non-flagged entries include `unified_patch`, while sensitive / binary / symlink / submodule / truncated entries render through the same placeholder flags used by the live path. Responses are bounded by per-file (256 KiB / 20k lines), per-run aggregate (5 MiB), and per-request (200 files) caps. Files exceeding a cap are returned with `truncated: true` and empty `contents`. Sensitive paths (credentials, keys) are elided with `sensitive: true` and empty `contents`.
|
||||
* Returns the set of file changes produced by a run as a list of before/after diffs. While the run\'s sandbox is reachable, diffs are resolved live against the sandbox working tree at the current HEAD. Degraded responses keep the same `data: FileDiff[]` shape. File contents are null on every entry; non-sensitive non-flagged entries include `unified_patch`, while sensitive / binary / symlink / submodule / truncated entries render through the same placeholder flags used by the live path. Responses are bounded by per-file (256 KiB / 20k lines), per-run aggregate (5 MiB), and per-request (200 files) caps. Files exceeding a cap are returned with `truncated: true` and empty `contents`. Sensitive paths (credentials, keys) are elided with `sensitive: true` and empty `contents`.
|
||||
* @summary List Run Files Changed
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {number} [pageLimit] Maximum number of items to return per page.
|
||||
|
|
@ -194,7 +194,7 @@ export const RunOutputsApiFp = function(configuration?: Configuration) {
|
|||
const localVarAxiosParamCreator = RunOutputsApiAxiosParamCreator(configuration)
|
||||
return {
|
||||
/**
|
||||
* Returns commits on the run branch since the run\'s base SHA, sourced directly from sandbox Git. The list uses first-parent chronological history and is capped by `limit` (default and maximum: 100). Commit data is Git-authoritative; Fabro-generated commit messages are not required for correctness.
|
||||
* Returns commits on the run branch since the run\'s base SHA, sourced directly from sandbox Git. The list uses first-parent chronological history and is capped by `limit` (default and maximum: 100). Commit data is Git-authoritative; Fabro-generated commit messages are not required for correctness.
|
||||
* @summary List Run Commits
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {number} [limit] Maximum number of commits to return. Defaults to 100 and is capped at 100.
|
||||
|
|
@ -208,7 +208,7 @@ export const RunOutputsApiFp = function(configuration?: Configuration) {
|
|||
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
|
||||
},
|
||||
/**
|
||||
* Returns the set of file changes produced by a run as a list of before/after diffs. While the run\'s sandbox is reachable, diffs are resolved live against the sandbox working tree at the current HEAD. Degraded responses keep the same `data: FileDiff[]` shape. File contents are null on every entry; non-sensitive non-flagged entries include `unified_patch`, while sensitive / binary / symlink / submodule / truncated entries render through the same placeholder flags used by the live path. Responses are bounded by per-file (256 KiB / 20k lines), per-run aggregate (5 MiB), and per-request (200 files) caps. Files exceeding a cap are returned with `truncated: true` and empty `contents`. Sensitive paths (credentials, keys) are elided with `sensitive: true` and empty `contents`.
|
||||
* Returns the set of file changes produced by a run as a list of before/after diffs. While the run\'s sandbox is reachable, diffs are resolved live against the sandbox working tree at the current HEAD. Degraded responses keep the same `data: FileDiff[]` shape. File contents are null on every entry; non-sensitive non-flagged entries include `unified_patch`, while sensitive / binary / symlink / submodule / truncated entries render through the same placeholder flags used by the live path. Responses are bounded by per-file (256 KiB / 20k lines), per-run aggregate (5 MiB), and per-request (200 files) caps. Files exceeding a cap are returned with `truncated: true` and empty `contents`. Sensitive paths (credentials, keys) are elided with `sensitive: true` and empty `contents`.
|
||||
* @summary List Run Files Changed
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {number} [pageLimit] Maximum number of items to return per page.
|
||||
|
|
@ -248,7 +248,7 @@ export const RunOutputsApiFactory = function (configuration?: Configuration, bas
|
|||
const localVarFp = RunOutputsApiFp(configuration)
|
||||
return {
|
||||
/**
|
||||
* Returns commits on the run branch since the run\'s base SHA, sourced directly from sandbox Git. The list uses first-parent chronological history and is capped by `limit` (default and maximum: 100). Commit data is Git-authoritative; Fabro-generated commit messages are not required for correctness.
|
||||
* Returns commits on the run branch since the run\'s base SHA, sourced directly from sandbox Git. The list uses first-parent chronological history and is capped by `limit` (default and maximum: 100). Commit data is Git-authoritative; Fabro-generated commit messages are not required for correctness.
|
||||
* @summary List Run Commits
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {number} [limit] Maximum number of commits to return. Defaults to 100 and is capped at 100.
|
||||
|
|
@ -259,7 +259,7 @@ export const RunOutputsApiFactory = function (configuration?: Configuration, bas
|
|||
return localVarFp.listRunCommits(id, limit, options).then((request) => request(axios, basePath));
|
||||
},
|
||||
/**
|
||||
* Returns the set of file changes produced by a run as a list of before/after diffs. While the run\'s sandbox is reachable, diffs are resolved live against the sandbox working tree at the current HEAD. Degraded responses keep the same `data: FileDiff[]` shape. File contents are null on every entry; non-sensitive non-flagged entries include `unified_patch`, while sensitive / binary / symlink / submodule / truncated entries render through the same placeholder flags used by the live path. Responses are bounded by per-file (256 KiB / 20k lines), per-run aggregate (5 MiB), and per-request (200 files) caps. Files exceeding a cap are returned with `truncated: true` and empty `contents`. Sensitive paths (credentials, keys) are elided with `sensitive: true` and empty `contents`.
|
||||
* Returns the set of file changes produced by a run as a list of before/after diffs. While the run\'s sandbox is reachable, diffs are resolved live against the sandbox working tree at the current HEAD. Degraded responses keep the same `data: FileDiff[]` shape. File contents are null on every entry; non-sensitive non-flagged entries include `unified_patch`, while sensitive / binary / symlink / submodule / truncated entries render through the same placeholder flags used by the live path. Responses are bounded by per-file (256 KiB / 20k lines), per-run aggregate (5 MiB), and per-request (200 files) caps. Files exceeding a cap are returned with `truncated: true` and empty `contents`. Sensitive paths (credentials, keys) are elided with `sensitive: true` and empty `contents`.
|
||||
* @summary List Run Files Changed
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {number} [pageLimit] Maximum number of items to return per page.
|
||||
|
|
@ -291,7 +291,7 @@ export const RunOutputsApiFactory = function (configuration?: Configuration, bas
|
|||
*/
|
||||
export class RunOutputsApi extends BaseAPI {
|
||||
/**
|
||||
* Returns commits on the run branch since the run\'s base SHA, sourced directly from sandbox Git. The list uses first-parent chronological history and is capped by `limit` (default and maximum: 100). Commit data is Git-authoritative; Fabro-generated commit messages are not required for correctness.
|
||||
* Returns commits on the run branch since the run\'s base SHA, sourced directly from sandbox Git. The list uses first-parent chronological history and is capped by `limit` (default and maximum: 100). Commit data is Git-authoritative; Fabro-generated commit messages are not required for correctness.
|
||||
* @summary List Run Commits
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {number} [limit] Maximum number of commits to return. Defaults to 100 and is capped at 100.
|
||||
|
|
@ -303,7 +303,7 @@ export class RunOutputsApi extends BaseAPI {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the set of file changes produced by a run as a list of before/after diffs. While the run\'s sandbox is reachable, diffs are resolved live against the sandbox working tree at the current HEAD. Degraded responses keep the same `data: FileDiff[]` shape. File contents are null on every entry; non-sensitive non-flagged entries include `unified_patch`, while sensitive / binary / symlink / submodule / truncated entries render through the same placeholder flags used by the live path. Responses are bounded by per-file (256 KiB / 20k lines), per-run aggregate (5 MiB), and per-request (200 files) caps. Files exceeding a cap are returned with `truncated: true` and empty `contents`. Sensitive paths (credentials, keys) are elided with `sensitive: true` and empty `contents`.
|
||||
* Returns the set of file changes produced by a run as a list of before/after diffs. While the run\'s sandbox is reachable, diffs are resolved live against the sandbox working tree at the current HEAD. Degraded responses keep the same `data: FileDiff[]` shape. File contents are null on every entry; non-sensitive non-flagged entries include `unified_patch`, while sensitive / binary / symlink / submodule / truncated entries render through the same placeholder flags used by the live path. Responses are bounded by per-file (256 KiB / 20k lines), per-run aggregate (5 MiB), and per-request (200 files) caps. Files exceeding a cap are returned with `truncated: true` and empty `contents`. Sensitive paths (credentials, keys) are elided with `sensitive: true` and empty `contents`.
|
||||
* @summary List Run Files Changed
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {number} [pageLimit] Maximum number of items to return per page.
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -71,7 +71,7 @@ import type { ValidateResponse } from '../models';
|
|||
export const RunsApiAxiosParamCreator = function (configuration?: Configuration) {
|
||||
return {
|
||||
/**
|
||||
* Marks a terminal run (`succeeded`, `failed`, or `dead`) as `archived`. Archived runs are hidden from default listings and are read-only until unarchived. Idempotent on already-archived runs. Returns 409 if the run is not terminal.
|
||||
* Marks a terminal run (`succeeded`, `failed`, or `dead`) as `archived`. Archived runs are hidden from default listings and are read-only until unarchived. Idempotent on already-archived runs. Returns 409 if the run is not terminal.
|
||||
* @summary Archive Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -193,7 +193,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
/**
|
||||
* Creates a new workflow run in `submitted` status from a self-contained manifest.
|
||||
* @summary Create Run
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -235,7 +235,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
* Creates a pull request for a completed run on GitHub and persists the record on the server.
|
||||
* @summary Create Run Pull Request
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {CreateRunPullRequestRequest} createRunPullRequestRequest
|
||||
* @param {CreateRunPullRequestRequest} createRunPullRequestRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -322,10 +322,10 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
};
|
||||
},
|
||||
/**
|
||||
* Creates a new run from a checkpoint of the source run. The source run is left untouched.
|
||||
* 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 {ForkRequest} [forkRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -405,7 +405,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
};
|
||||
},
|
||||
/**
|
||||
* Returns checkpoint timeline entries from durable run-store checkpoints. Metadata branches are write-only archives and are not read by this endpoint.
|
||||
* 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.
|
||||
|
|
@ -550,7 +550,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
* Merges the stored pull request for a run on GitHub.
|
||||
* @summary Merge Run Pull Request
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {MergeRunPullRequestRequest} mergeRunPullRequestRequest
|
||||
* @param {MergeRunPullRequestRequest} mergeRunPullRequestRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -634,7 +634,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
/**
|
||||
* Validates and renders a workflow manifest as SVG without creating a run.
|
||||
* @summary Render Workflow Graph
|
||||
* @param {RenderWorkflowGraphRequest} renderWorkflowGraphRequest
|
||||
* @param {RenderWorkflowGraphRequest} renderWorkflowGraphRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -841,10 +841,10 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
};
|
||||
},
|
||||
/**
|
||||
* 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.
|
||||
* 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 {RewindRequest} [rewindRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -886,7 +886,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
/**
|
||||
* Validates runtime readiness for a workflow manifest without creating a run.
|
||||
* @summary Validate Workflow Manifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -928,7 +928,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
* Starts a submitted run, queuing it for execution. Provide `resume=true` to resume an interrupted run from checkpoint. Returns 409 if the run is not startable.
|
||||
* @summary Start Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {StartRunRequest} [startRunRequest]
|
||||
* @param {StartRunRequest} [startRunRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -968,7 +968,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
};
|
||||
},
|
||||
/**
|
||||
* Restores an archived run to its prior terminal status. Idempotent on runs that are terminal but not archived (returns the current status without emitting an event). Returns 409 if the run is active.
|
||||
* Restores an archived run to its prior terminal status. Idempotent on runs that are terminal but not archived (returns the current status without emitting an event). Returns 409 if the run is active.
|
||||
* @summary Unarchive Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -1051,7 +1051,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
* Updates mutable run metadata. Title updates are allowed for all run states, including archived runs.
|
||||
* @summary Update Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {UpdateRunRequest} updateRunRequest
|
||||
* @param {UpdateRunRequest} updateRunRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1095,7 +1095,7 @@ export const RunsApiAxiosParamCreator = function (configuration?: Configuration)
|
|||
/**
|
||||
* Validates workflow structure and diagnostics without runtime readiness checks.
|
||||
* @summary Validate Workflow Manifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1143,7 +1143,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
const localVarAxiosParamCreator = RunsApiAxiosParamCreator(configuration)
|
||||
return {
|
||||
/**
|
||||
* Marks a terminal run (`succeeded`, `failed`, or `dead`) as `archived`. Archived runs are hidden from default listings and are read-only until unarchived. Idempotent on already-archived runs. Returns 409 if the run is not terminal.
|
||||
* Marks a terminal run (`succeeded`, `failed`, or `dead`) as `archived`. Archived runs are hidden from default listings and are read-only until unarchived. Idempotent on already-archived runs. Returns 409 if the run is not terminal.
|
||||
* @summary Archive Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -1184,7 +1184,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
/**
|
||||
* Creates a new workflow run in `submitted` status from a self-contained manifest.
|
||||
* @summary Create Run
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1198,7 +1198,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
* Creates a pull request for a completed run on GitHub and persists the record on the server.
|
||||
* @summary Create Run Pull Request
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {CreateRunPullRequestRequest} createRunPullRequestRequest
|
||||
* @param {CreateRunPullRequestRequest} createRunPullRequestRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1223,10 +1223,10 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
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.
|
||||
* 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 {ForkRequest} [forkRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1250,7 +1250,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
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.
|
||||
* 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.
|
||||
|
|
@ -1296,7 +1296,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
* Merges the stored pull request for a run on GitHub.
|
||||
* @summary Merge Run Pull Request
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {MergeRunPullRequestRequest} mergeRunPullRequestRequest
|
||||
* @param {MergeRunPullRequestRequest} mergeRunPullRequestRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1322,7 +1322,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
/**
|
||||
* Validates and renders a workflow manifest as SVG without creating a run.
|
||||
* @summary Render Workflow Graph
|
||||
* @param {RenderWorkflowGraphRequest} renderWorkflowGraphRequest
|
||||
* @param {RenderWorkflowGraphRequest} renderWorkflowGraphRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1386,10 +1386,10 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
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.
|
||||
* 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 {RewindRequest} [rewindRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1402,7 +1402,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
/**
|
||||
* Validates runtime readiness for a workflow manifest without creating a run.
|
||||
* @summary Validate Workflow Manifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1416,7 +1416,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
* Starts a submitted run, queuing it for execution. Provide `resume=true` to resume an interrupted run from checkpoint. Returns 409 if the run is not startable.
|
||||
* @summary Start Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {StartRunRequest} [startRunRequest]
|
||||
* @param {StartRunRequest} [startRunRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1427,7 +1427,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
|
||||
},
|
||||
/**
|
||||
* Restores an archived run to its prior terminal status. Idempotent on runs that are terminal but not archived (returns the current status without emitting an event). Returns 409 if the run is active.
|
||||
* Restores an archived run to its prior terminal status. Idempotent on runs that are terminal but not archived (returns the current status without emitting an event). Returns 409 if the run is active.
|
||||
* @summary Unarchive Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -1456,7 +1456,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
* Updates mutable run metadata. Title updates are allowed for all run states, including archived runs.
|
||||
* @summary Update Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {UpdateRunRequest} updateRunRequest
|
||||
* @param {UpdateRunRequest} updateRunRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1469,7 +1469,7 @@ export const RunsApiFp = function(configuration?: Configuration) {
|
|||
/**
|
||||
* Validates workflow structure and diagnostics without runtime readiness checks.
|
||||
* @summary Validate Workflow Manifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1489,7 +1489,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
const localVarFp = RunsApiFp(configuration)
|
||||
return {
|
||||
/**
|
||||
* Marks a terminal run (`succeeded`, `failed`, or `dead`) as `archived`. Archived runs are hidden from default listings and are read-only until unarchived. Idempotent on already-archived runs. Returns 409 if the run is not terminal.
|
||||
* Marks a terminal run (`succeeded`, `failed`, or `dead`) as `archived`. Archived runs are hidden from default listings and are read-only until unarchived. Idempotent on already-archived runs. Returns 409 if the run is not terminal.
|
||||
* @summary Archive Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -1521,7 +1521,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
/**
|
||||
* Creates a new workflow run in `submitted` status from a self-contained manifest.
|
||||
* @summary Create Run
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1532,7 +1532,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
* Creates a pull request for a completed run on GitHub and persists the record on the server.
|
||||
* @summary Create Run Pull Request
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {CreateRunPullRequestRequest} createRunPullRequestRequest
|
||||
* @param {CreateRunPullRequestRequest} createRunPullRequestRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1551,10 +1551,10 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
return localVarFp.deleteRun(id, force, options).then((request) => request(axios, basePath));
|
||||
},
|
||||
/**
|
||||
* Creates a new run from a checkpoint of the source run. The source run is left untouched.
|
||||
* 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 {ForkRequest} [forkRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1572,7 +1572,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
return localVarFp.getRunPullRequest(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.
|
||||
* 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.
|
||||
|
|
@ -1609,7 +1609,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
* Merges the stored pull request for a run on GitHub.
|
||||
* @summary Merge Run Pull Request
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {MergeRunPullRequestRequest} mergeRunPullRequestRequest
|
||||
* @param {MergeRunPullRequestRequest} mergeRunPullRequestRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1629,7 +1629,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
/**
|
||||
* Validates and renders a workflow manifest as SVG without creating a run.
|
||||
* @summary Render Workflow Graph
|
||||
* @param {RenderWorkflowGraphRequest} renderWorkflowGraphRequest
|
||||
* @param {RenderWorkflowGraphRequest} renderWorkflowGraphRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1678,10 +1678,10 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
return localVarFp.retrieveRunGraphSource(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.
|
||||
* 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 {RewindRequest} [rewindRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1691,7 +1691,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
/**
|
||||
* Validates runtime readiness for a workflow manifest without creating a run.
|
||||
* @summary Validate Workflow Manifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1702,7 +1702,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
* Starts a submitted run, queuing it for execution. Provide `resume=true` to resume an interrupted run from checkpoint. Returns 409 if the run is not startable.
|
||||
* @summary Start Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {StartRunRequest} [startRunRequest]
|
||||
* @param {StartRunRequest} [startRunRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1710,7 +1710,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
return localVarFp.startRun(id, startRunRequest, options).then((request) => request(axios, basePath));
|
||||
},
|
||||
/**
|
||||
* Restores an archived run to its prior terminal status. Idempotent on runs that are terminal but not archived (returns the current status without emitting an event). Returns 409 if the run is active.
|
||||
* Restores an archived run to its prior terminal status. Idempotent on runs that are terminal but not archived (returns the current status without emitting an event). Returns 409 if the run is active.
|
||||
* @summary Unarchive Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -1733,7 +1733,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
* Updates mutable run metadata. Title updates are allowed for all run states, including archived runs.
|
||||
* @summary Update Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {UpdateRunRequest} updateRunRequest
|
||||
* @param {UpdateRunRequest} updateRunRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1743,7 +1743,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
/**
|
||||
* Validates workflow structure and diagnostics without runtime readiness checks.
|
||||
* @summary Validate Workflow Manifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1758,7 +1758,7 @@ export const RunsApiFactory = function (configuration?: Configuration, basePath?
|
|||
*/
|
||||
export class RunsApi extends BaseAPI {
|
||||
/**
|
||||
* Marks a terminal run (`succeeded`, `failed`, or `dead`) as `archived`. Archived runs are hidden from default listings and are read-only until unarchived. Idempotent on already-archived runs. Returns 409 if the run is not terminal.
|
||||
* Marks a terminal run (`succeeded`, `failed`, or `dead`) as `archived`. Archived runs are hidden from default listings and are read-only until unarchived. Idempotent on already-archived runs. Returns 409 if the run is not terminal.
|
||||
* @summary Archive Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -1793,7 +1793,7 @@ export class RunsApi extends BaseAPI {
|
|||
/**
|
||||
* Creates a new workflow run in `submitted` status from a self-contained manifest.
|
||||
* @summary Create Run
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1805,7 +1805,7 @@ export class RunsApi extends BaseAPI {
|
|||
* Creates a pull request for a completed run on GitHub and persists the record on the server.
|
||||
* @summary Create Run Pull Request
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {CreateRunPullRequestRequest} createRunPullRequestRequest
|
||||
* @param {CreateRunPullRequestRequest} createRunPullRequestRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1826,10 +1826,10 @@ export class RunsApi extends BaseAPI {
|
|||
}
|
||||
|
||||
/**
|
||||
* Creates a new run from a checkpoint of the source run. The source run is left untouched.
|
||||
* 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 {ForkRequest} [forkRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1849,7 +1849,7 @@ export class RunsApi extends BaseAPI {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns checkpoint timeline entries from durable run-store checkpoints. Metadata branches are write-only archives and are not read by this endpoint.
|
||||
* 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.
|
||||
|
|
@ -1889,7 +1889,7 @@ export class RunsApi extends BaseAPI {
|
|||
* Merges the stored pull request for a run on GitHub.
|
||||
* @summary Merge Run Pull Request
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {MergeRunPullRequestRequest} mergeRunPullRequestRequest
|
||||
* @param {MergeRunPullRequestRequest} mergeRunPullRequestRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1911,7 +1911,7 @@ export class RunsApi extends BaseAPI {
|
|||
/**
|
||||
* Validates and renders a workflow manifest as SVG without creating a run.
|
||||
* @summary Render Workflow Graph
|
||||
* @param {RenderWorkflowGraphRequest} renderWorkflowGraphRequest
|
||||
* @param {RenderWorkflowGraphRequest} renderWorkflowGraphRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1965,10 +1965,10 @@ export class RunsApi extends BaseAPI {
|
|||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* 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 {RewindRequest} [rewindRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1979,7 +1979,7 @@ export class RunsApi extends BaseAPI {
|
|||
/**
|
||||
* Validates runtime readiness for a workflow manifest without creating a run.
|
||||
* @summary Validate Workflow Manifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -1991,7 +1991,7 @@ export class RunsApi extends BaseAPI {
|
|||
* Starts a submitted run, queuing it for execution. Provide `resume=true` to resume an interrupted run from checkpoint. Returns 409 if the run is not startable.
|
||||
* @summary Start Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {StartRunRequest} [startRunRequest]
|
||||
* @param {StartRunRequest} [startRunRequest]
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -2000,7 +2000,7 @@ export class RunsApi extends BaseAPI {
|
|||
}
|
||||
|
||||
/**
|
||||
* Restores an archived run to its prior terminal status. Idempotent on runs that are terminal but not archived (returns the current status without emitting an event). Returns 409 if the run is active.
|
||||
* Restores an archived run to its prior terminal status. Idempotent on runs that are terminal but not archived (returns the current status without emitting an event). Returns 409 if the run is active.
|
||||
* @summary Unarchive Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {*} [options] Override http request option.
|
||||
|
|
@ -2025,7 +2025,7 @@ export class RunsApi extends BaseAPI {
|
|||
* Updates mutable run metadata. Title updates are allowed for all run states, including archived runs.
|
||||
* @summary Update Run
|
||||
* @param {string} id Unique run identifier (ULID).
|
||||
* @param {UpdateRunRequest} updateRunRequest
|
||||
* @param {UpdateRunRequest} updateRunRequest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
@ -2036,7 +2036,7 @@ export class RunsApi extends BaseAPI {
|
|||
/**
|
||||
* Validates workflow structure and diagnostics without runtime readiness checks.
|
||||
* @summary Validate Workflow Manifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {RunManifest} runManifest
|
||||
* @param {*} [options] Override http request option.
|
||||
* @throws {RequiredError}
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -34,5 +34,3 @@ export const AuthSessionKindEnum = {
|
|||
} as const;
|
||||
|
||||
export type AuthSessionKindEnum = typeof AuthSessionKindEnum[keyof typeof AuthSessionKindEnum];
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -20,4 +20,3 @@ import type { AuthSession } from './auth-session';
|
|||
export interface AuthSessionsResponse {
|
||||
'sessions': Array<AuthSession>;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -18,4 +18,3 @@ export interface AutomationRef {
|
|||
'id': string;
|
||||
'name': string | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -28,6 +28,3 @@ export interface BillingModelRef {
|
|||
'model_id': string;
|
||||
'speed'?: BillingSpeed | null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -24,6 +24,3 @@ export const BillingSpeed = {
|
|||
} as const;
|
||||
|
||||
export type BillingSpeed = typeof BillingSpeed[keyof typeof BillingSpeed];
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -28,4 +28,3 @@ export interface CheckpointRecord {
|
|||
'checkpoint': RunCheckpoint;
|
||||
'diff': RunDiff;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -40,6 +40,3 @@ export interface Conclusion {
|
|||
'total_retries': number;
|
||||
'diff': RunDiff;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -25,4 +25,3 @@ export interface DeleteRunResponse {
|
|||
'sandbox_preserved': boolean;
|
||||
'sandbox': DeleteRunSandbox;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -21,6 +21,3 @@ export interface DeleteRunSandbox {
|
|||
'provider': SandboxProvider;
|
||||
'id': string;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -31,4 +31,3 @@ export interface PaginatedBoardRunList {
|
|||
'data': Array<Run>;
|
||||
'meta': PaginationMeta;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -27,4 +27,3 @@ export interface PaginatedRunCommitList {
|
|||
'data': Array<RunCommit>;
|
||||
'meta': RunCommitsMeta;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -21,10 +21,9 @@ import type { FileDiff } from './file-diff';
|
|||
import type { RunFilesMeta } from './run-files-meta';
|
||||
|
||||
/**
|
||||
* List of file diffs produced by a run, with metadata describing truncation and degraded-response state. Naturally bounded: at most 200 files per response. Consumers should inspect `meta.truncated` rather than assuming `data.length` equals the run\'s total change count.
|
||||
* List of file diffs produced by a run, with metadata describing truncation and degraded-response state. Naturally bounded: at most 200 files per response. Consumers should inspect `meta.truncated` rather than assuming `data.length` equals the run\'s total change count.
|
||||
*/
|
||||
export interface PaginatedRunFileList {
|
||||
'data': Array<FileDiff>;
|
||||
'meta': RunFilesMeta;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -27,4 +27,3 @@ export interface PaginatedRunList {
|
|||
'data': Array<Run>;
|
||||
'meta': PaginationMeta;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -24,4 +24,3 @@ export interface PendingInterviewRecord {
|
|||
'question': InterviewQuestionRecord;
|
||||
'started_at': string;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -18,4 +18,3 @@ export interface PullRequestDetailsTimestamps {
|
|||
'created_at': string;
|
||||
'updated_at': string;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -44,4 +44,3 @@ export interface PullRequestDetails {
|
|||
'author': PullRequestUser;
|
||||
'timestamps': PullRequestDetailsTimestamps;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -33,5 +33,3 @@ export const PullRequestProviderEnum = {
|
|||
} as const;
|
||||
|
||||
export type PullRequestProviderEnum = typeof PullRequestProviderEnum[keyof typeof PullRequestProviderEnum];
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -30,5 +30,3 @@ export const RepositoryRefProviderEnum = {
|
|||
} as const;
|
||||
|
||||
export type RepositoryRefProviderEnum = typeof RepositoryRefProviderEnum[keyof typeof RepositoryRefProviderEnum];
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -17,4 +17,3 @@
|
|||
export interface RunBillingSummary {
|
||||
'total_usd_micros': number | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -21,4 +21,3 @@ export interface RunCommitParent {
|
|||
'sha': string;
|
||||
'short_sha': string;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -22,4 +22,3 @@ export interface RunCommitPerson {
|
|||
'email': string;
|
||||
'date': string | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -35,4 +35,3 @@ export interface RunCommit {
|
|||
'trailers': { [key: string]: string; };
|
||||
'tree_sha': string | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -31,5 +31,3 @@ export const RunCommitsMetaSourceEnum = {
|
|||
} as const;
|
||||
|
||||
export type RunCommitsMetaSourceEnum = typeof RunCommitsMetaSourceEnum[keyof typeof RunCommitsMetaSourceEnum];
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -24,4 +24,3 @@ export interface RunDiff {
|
|||
'patch'?: string | null;
|
||||
'summary'?: DiffSummary | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -31,6 +31,3 @@ export interface RunLifecycle {
|
|||
'archived': boolean;
|
||||
'archived_at': string | null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -17,4 +17,3 @@
|
|||
export interface RunLinks {
|
||||
'web': string | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -18,4 +18,3 @@ export interface RunModel {
|
|||
'provider': string | null;
|
||||
'name': string;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -23,5 +23,3 @@ export const RunOriginKindEnum = {
|
|||
} as const;
|
||||
|
||||
export type RunOriginKindEnum = typeof RunOriginKindEnum[keyof typeof RunOriginKindEnum];
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -74,6 +74,3 @@ export interface RunProjection {
|
|||
*/
|
||||
'stages': { [key: string]: StageProjection; };
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -21,4 +21,3 @@ export interface RunSandboxRuntime {
|
|||
'clone_origin_url': string | null;
|
||||
'clone_branch': string | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -32,6 +32,3 @@ export interface RunSandboxSettings {
|
|||
'docker': DockerSettings | null;
|
||||
'daytona': DaytonaSettings | null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -29,6 +29,3 @@ export interface RunSandbox {
|
|||
'snapshot': string | null;
|
||||
'runtime': RunSandboxRuntime | null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -43,4 +43,3 @@ export interface RunSpec {
|
|||
'git'?: GitContext | null;
|
||||
'fork_source_ref'?: ForkSourceRef | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -52,8 +52,6 @@ import type { RunStatusSucceeded } from './run-status-succeeded';
|
|||
|
||||
/**
|
||||
* @type RunStatus
|
||||
* Execution status of a run. Archive state is represented separately on `RunLifecycle.archived` so terminal status payloads remain intact.
|
||||
* Execution status of a run. Archive state is represented separately on `RunLifecycle.archived` so terminal status payloads remain intact.
|
||||
*/
|
||||
export type RunStatus = { kind: 'blocked' } & RunStatusBlocked | { kind: 'dead' } & RunStatusDead | { kind: 'failed' } & RunStatusFailed | { kind: 'paused' } & RunStatusPaused | { kind: 'queued' } & RunStatusQueued | { kind: 'removing' } & RunStatusRemoving | { kind: 'running' } & RunStatusRunning | { kind: 'starting' } & RunStatusStarting | { kind: 'submitted' } & RunStatusSubmitted | { kind: 'succeeded' } & RunStatusSucceeded;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -22,4 +22,3 @@ export interface RunTimestamps {
|
|||
'duration_ms'?: number | null;
|
||||
'elapsed_secs'?: number | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -81,4 +81,3 @@ export interface Run {
|
|||
'superseded_by': string | null;
|
||||
'links': RunLinks;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -47,6 +47,3 @@ export interface SandboxDetails {
|
|||
'labels': { [key: string]: string; };
|
||||
'timestamps': SandboxTimestamps;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -25,6 +25,3 @@ export const SandboxProvider = {
|
|||
} as const;
|
||||
|
||||
export type SandboxProvider = typeof SandboxProvider[keyof typeof SandboxProvider];
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -31,4 +31,3 @@ export interface SandboxResources {
|
|||
*/
|
||||
'disk_bytes'?: number;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -24,6 +24,3 @@ export const SandboxServiceDiscoverySource = {
|
|||
} as const;
|
||||
|
||||
export type SandboxServiceDiscoverySource = typeof SandboxServiceDiscoverySource[keyof typeof SandboxServiceDiscoverySource];
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -23,6 +23,3 @@ import type { SandboxServiceDiscoverySource } from './sandbox-service-discovery-
|
|||
export interface SandboxServiceListMeta {
|
||||
'source': SandboxServiceDiscoverySource;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -27,4 +27,3 @@ export interface SandboxServiceListResponse {
|
|||
'data': Array<SandboxService>;
|
||||
'meta': SandboxServiceListMeta;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -35,4 +35,3 @@ export interface SandboxService {
|
|||
*/
|
||||
'preview_supported': boolean;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -35,6 +35,3 @@ export const SandboxState = {
|
|||
} as const;
|
||||
|
||||
export type SandboxState = typeof SandboxState[keyof typeof SandboxState];
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -27,4 +27,3 @@ export interface SandboxTimestamps {
|
|||
*/
|
||||
'last_activity_at'?: string;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -23,4 +23,3 @@ export interface SshAccessRequest {
|
|||
*/
|
||||
'ttl_minutes': number;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -23,4 +23,3 @@ export interface SshAccessResponse {
|
|||
*/
|
||||
'command': string;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -73,6 +73,3 @@ export interface StageProjection {
|
|||
*/
|
||||
'state': StageState;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -24,4 +24,3 @@ export interface StageSummary {
|
|||
'billing_usd_micros'?: number | null;
|
||||
'retries': number;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -22,4 +22,3 @@ export interface StartRecord {
|
|||
'run_branch'?: string | null;
|
||||
'base_sha'?: string | null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -35,4 +35,3 @@ export interface VncPreviewResponse {
|
|||
*/
|
||||
'expires_in_secs': number;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
* HTTP API for managing Fabro workflow run executions.
|
||||
*
|
||||
* The version of the OpenAPI document: 0.1.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
|
|
@ -18,4 +18,3 @@ export interface WorkflowRef {
|
|||
'slug': string | null;
|
||||
'name': string;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue