import * as Encoding from "effect/Encoding";import { CheckpointRef, ProjectId, type ThreadId } from "@t3tools/contracts"; export const CHECKPOINT_REFS_PREFIX = "refs/t3/checkpoints"; export function checkpointRefForThreadTurn(threadId: ThreadId, turnCount: number): CheckpointRef { return CheckpointRef.make( `${CHECKPOINT_REFS_PREFIX}/${Encoding.encodeBase64Url(threadId)}/turn/${turnCount}`, );} export function resolveThreadWorkspaceCwd(input: { readonly thread: { readonly projectId: ProjectId; readonly worktreePath: string | null; }; readonly projects: ReadonlyArray<{ readonly id: ProjectId; readonly workspaceRoot: string; }>;}): string | undefined { const worktreeCwd = input.thread.worktreePath ?? undefined; if (worktreeCwd) { return worktreeCwd; } return input.projects.find((project) => project.id === input.thread.projectId)?.workspaceRoot;}
import * as Encoding from "effect/Encoding";
import { CheckpointRef, ProjectId, type ThreadId } from "@t3tools/contracts";
export const CHECKPOINT_REFS_PREFIX = "refs/t3/checkpoints";
export function checkpointRefForThreadTurn(threadId: ThreadId, turnCount: number): CheckpointRef {
return CheckpointRef.make(
`${CHECKPOINT_REFS_PREFIX}/${Encoding.encodeBase64Url(threadId)}/turn/${turnCount}`,
);
}
export function resolveThreadWorkspaceCwd(input: {
readonly thread: {
readonly projectId: ProjectId;
readonly worktreePath: string | null;
};
readonly projects: ReadonlyArray<{
readonly id: ProjectId;
readonly workspaceRoot: string;
}>;
}): string | undefined {
const worktreeCwd = input.thread.worktreePath ?? undefined;
if (worktreeCwd) {
return worktreeCwd;
}
return input.projects.find((project) => project.id === input.thread.projectId)?.workspaceRoot;
}