framework
Version:
The (AI) Framework: turnkey, zero-config AI orchestration that wraps a coding-agent CLI (Claude Code) as a black box and takes you from an idea to a running app. Vite for AI.
119 lines • 6.49 kB
TypeScript
import { type AgentStatus } from './store/index.js';
/** A retained worktree and the agent that left it behind (#752). */
export interface WorktreeRow {
/** The agent id, which is also the worktree's directory name. */
agentId: string;
/** The branch the agent's work landed on, when its meta recorded one (#799). */
branch?: string;
/** How the agent that left this checkout ended, or `running` while it is still going. */
status?: AgentStatus;
/** Size on disk in bytes, absent for a live agent (its tree is still changing) or when unreadable. */
sizeBytes?: number;
/** True while the agent owning this checkout is still going: it is in use, not retained. */
live: boolean;
}
/** Why a worktree was left in place by {@link pruneProjectWorktrees}. */
export interface SkippedWorktree {
agentId: string;
reason: string;
}
/** What {@link pruneProjectWorktrees} did. */
export interface PruneResult {
removed: string[];
skipped: SkippedWorktree[];
}
/** The outcome of {@link removeProjectWorktree}. */
export type RemoveResult = {
ok: true;
} | {
ok: false;
error: string;
};
/** Surface-specific work {@link removeProjectWorktree} does once removal is decided on. */
export interface RemoveWorktreeOptions {
/**
* Run after the safety checks pass and the work is committed, just before the checkout goes.
* The dashboard stops the preview serving that tree here (#797); the CLI has none to stop.
*/
beforeRemove?: (agentId: string) => Promise<void>;
}
/**
* The worktrees a project still has on disk (#752), newest first — the same view the dashboard's
* retained-worktrees list is built from, through the same store reads, so the CLI is a second
* surface rather than a second behaviour.
*
* A live agent's checkout is included and flagged rather than hidden: "what is this directory and
* why can I not remove it" is exactly the question the list has to answer.
*/
export declare function listProjectWorktrees(cwd: string, opts?: {
sizes?: boolean;
}): Promise<WorktreeRow[]>;
/**
* Remove one retained worktree (#752/#737/E5): the one implementation behind every surface that
* removes one — the sweep, teardown, and the dashboard's Remove button (#982).
*
* **One rule: only what is on the remote may go.** The work is committed to the session's branch,
* the branch is pushed, and the checkout is removed only once the remote has it. Every deletion is
* therefore recoverable, and nothing local is ever the last copy of anything. It replaced three
* interacting rules that each asked *what state did this session end in* — a clean finish removes
* the checkout, a failure or stop keeps it, a merged branch reclaims it later via two different
* "landed" signals — where the question that actually matters is *is this recoverable yet*. There
* is one failure mode now, and it is legible: the push did not land, so the checkout stays and the
* reason says why.
*
* The push serves the rule; it is not a licence to publish. A session armed to publish nothing
* (`handoff: local`, B5/#1379) said its branch must not reach the remote, so its unpushed checkout
* is kept — the same outcome as a repo with no remote — rather than pushed to make it removable.
* Deciding otherwise would have teardown publish the very branch the agent's own handoff just
* declined to. Nothing is committed on the way to that refusal either — a kept checkout is a
* place someone works, and the sweep re-offers it every pass — so it goes only from a clean tree
* on a pushed tip. And a record that cannot be read keeps the checkout too: unreadable is not
* "publish freely".
*
* Refuses while the agent is still going — an agent's checkout is where its agent is working, and Stop
* is how you end an agent, not pulling the floor out from under it.
*/
export declare function removeProjectWorktree(cwd: string, agentId: string, opts?: RemoveWorktreeOptions): Promise<RemoveResult>;
/** The outcome of {@link deleteProjectAgent}. */
export type DeleteAgentResult = {
ok: true;
} | {
ok: false;
error: string;
};
/** Surface-specific work {@link deleteProjectAgent} does, and the file-removal seam for tests. */
export interface DeleteAgentOptions {
/** Run before the worktree comes off disk (stop a preview serving it, as removal does). */
beforeRemove?: (agentId: string) => Promise<void>;
/** Remove one file, tolerant of an absent one. Defaults to `rm(path, { force: true })`. */
removeFile?: (path: string) => Promise<void>;
}
/**
* Delete a session (#1032): take it out of the dashboard, records and all.
*
* This is the sibling of {@link removeProjectWorktree}, and the difference is the whole point.
* Remove-worktree reclaims the checkout on disk and keeps the session — its row, its replayable
* log — because the history was already archived. Delete removes that archive too: the agent meta
* (`<id>.json`, what the rail lists) and its event log (`<id>.jsonl`, what replays), wherever they
* are filed, so the row is gone for good. It is the one destructive-of-history action, which is
* why the surfaces that call it confirm first. Since #1179 that archive is committed, so the files
* go but the deletion is itself a change git will record.
*
* What it deliberately leaves is git's, not the dashboard's: the branch `tf-agent-<id>`
* (or the name the agent gave it) and its commits. Deleting a branch that may carry merged work
* or an open PR is not a thing a
* dashboard action should do silently, so the branch stays and delete means "remove from the
* dashboard", not "erase every trace".
*
* Refuses while the agent is still going — Stop is how an agent ends. Any uncommitted work in the
* worktree is discarded with it, which is the intent here (the session is being thrown away),
* unlike remove-worktree, which commits that work to the kept branch first.
*/
export declare function deleteProjectAgent(cwd: string, agentId: string, opts?: DeleteAgentOptions): Promise<DeleteAgentResult>;
/**
* Remove every retained worktree whose run is not live (#752): the "clean all of this up" case.
* A live agent keeps its checkout and is reported as skipped, so the count always adds up to what
* the list showed — and so does one whose branch could not reach the remote (E5).
*/
export declare function pruneProjectWorktrees(cwd: string): Promise<PruneResult>;
//# sourceMappingURL=worktrees.d.ts.map