mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-05 21:02:34 +01:00
Merge current master lifecycle and CI fixes into Claude behavior
Co-Authored-By: Paperclip <noreply@paperclip.ing> * codex/claude-runner-protocol: fix(grok): avoid routine wakes for proactive admission (#16422) feat(ci): profile full CODEOWNER PR suites in Honeycomb (#16378) test: bound command snapshot forwarding checks (#16421) fix(agents): report actionable lifecycle failure steps (#16418)
This commit is contained in:
commit
bd3ceab2b2
50 files changed
+1630
-60
No files matched your search
@@ -34,7 +34,9 @@ it("retries a failed step once while pending and removes the failure after recov
|
||||
try {
|
||||
await act(async () => root.render(<AgentLifecycleStatus agent={agent} onRetry={retry} retryPending={false} />));
|
||||
expect(container.textContent).toContain(agent.lifecycleError);
|
||||
expect(container.textContent).toContain("Termination is not complete");
|
||||
expect(container.textContent).toContain("Agent cleanup failed");
|
||||
expect(container.textContent).toContain("Paperclip retries automatically");
|
||||
expect(container.textContent).not.toContain("Required resources are being removed");
|
||||
await act(async () => container.querySelector("button")!.click());
|
||||
expect(retry).toHaveBeenCalledOnce();
|
||||
await act(async () => root.render(<AgentLifecycleStatus agent={agent} onRetry={retry} retryPending />));
|
||||
|
||||
@@ -15,6 +15,12 @@ const phases = {
|
||||
cleaning_up: ["Cleaning up agent", "Required resources are being removed. Termination is not complete."],
|
||||
} satisfies Partial<Record<AgentLifecycleState, [string, string]>>;
|
||||
|
||||
const failedPhases = {
|
||||
preparing: "Agent preparation failed", verifying: "Agent verification failed",
|
||||
pausing: "Agent pause failed", resuming: "Agent resume failed",
|
||||
terminating: "Agent termination failed", cleaning_up: "Agent cleanup failed",
|
||||
};
|
||||
|
||||
function pendingPhase(state?: AgentLifecycleState) {
|
||||
return state && state in phases ? phases[state as keyof typeof phases] : undefined;
|
||||
}
|
||||
@@ -48,15 +54,16 @@ export function AgentLifecycleStatus({ agent, onRetry, retryPending, refreshErro
|
||||
{phase && <div className="flex flex-wrap items-center gap-2">
|
||||
<Badge variant={agent.lifecycleError ? "destructive" : "secondary"}>
|
||||
{!agent.lifecycleError && <Loader2 aria-hidden="true" className="mr-1 size-3 animate-spin motion-reduce:animate-none" />}
|
||||
{phase[0]}
|
||||
{agent.lifecycleError ? failedPhases[agent.lifecycleState as keyof typeof failedPhases] : phase[0]}
|
||||
</Badge>
|
||||
<span className="text-muted-foreground">{phase[1]}</span>
|
||||
{!agent.lifecycleError && <span className="text-muted-foreground">{phase[1]}</span>}
|
||||
</div>}
|
||||
{phase && agent.lifecycleError && <div className="flex flex-wrap items-center gap-2 text-destructive">
|
||||
<span>{agent.lifecycleError}</span>
|
||||
<Button variant="outline" size="sm" disabled={retryPending} onClick={onRetry}>
|
||||
{retryPending ? "Retrying…" : "Retry"}
|
||||
{retryPending ? "Retrying…" : "Retry now"}
|
||||
</Button>
|
||||
</div>}
|
||||
{phase && agent.lifecycleError && <p className="text-muted-foreground">Paperclip retries automatically; Retry now checks again immediately.</p>}
|
||||
</div>;
|
||||
}
|
||||
Reference in new issue
Block a user