import type { QuestBoard } from "../domain/questBoard.js"; import type { LoadedConfig, MateriaCastState, ResolvedMateriaPipeline } from "../types.js"; export interface ConfigRepository { load(cwd: string, configuredPath?: string): Promise; saveActiveLoadout(cwd: string, loadoutName: string, configuredPath?: string): Promise; resolveArtifactRoot(cwd: string, artifactDir?: string): string; } export interface PipelinePresenter { resolve(config: LoadedConfig["config"]): ResolvedMateriaPipeline; renderGrid(config: LoadedConfig["config"], pipeline: ResolvedMateriaPipeline, source: string, cwd: string): string[]; renderLoadoutList(config: LoadedConfig["config"], source: string): string[]; renderLoadoutCatalog(config: LoadedConfig["config"], source: string, loadoutSources?: Record): string[]; } export interface CastStateRepository { loadActive(session: TSession): MateriaCastState | undefined; listLatest(session: TSession): MateriaCastState[]; listResumable(session: TSession): MateriaCastState[]; listRevivable(session: TSession): MateriaCastState[]; } export interface ArtifactCatalog { renderCastList(artifactRoot: string, sessionStates?: MateriaCastState[]): Promise; } export interface CastContextPort { buildIsolatedContext(eventMessages: unknown, state: MateriaCastState): unknown; } export interface CastAgentTurnPort { prepareAgentStartSystemPrompt(input: { pi: TPi; session: TSession; state: MateriaCastState; systemPrompt: string }): Promise; handleAgentEnd(pi: TPi, event: TAgentEvent, session: TSession): Promise; } export type InitialPromptDispatchPolicy = "immediate" | "defer-agent-trigger"; export interface CastStartOptions { /** Optional shared cast data to seed before the first socket starts. */ initialData?: Record; /** Optional extra details recorded on the normal cast_start event. */ startEventDetails?: Record; /** Transient policy for dispatching the first agent prompt of a new cast. */ initialPromptDispatch?: InitialPromptDispatchPolicy; } export interface CastLifecyclePort { start(pi: TPi, session: TSession, loaded: LoadedConfig, pipeline: ResolvedMateriaPipeline, request: string, options?: CastStartOptions): Promise; continue(pi: TPi, session: TSession, state: MateriaCastState): Promise; resume(pi: TPi, session: TSession, castId: string): Promise; revive(pi: TPi, session: TSession, castId: string): Promise; clear(pi: TPi, state: MateriaCastState, reason: string): void; } export interface CastStatusPort { statusLabel(state: MateriaCastState): string; } export interface Logger { info?(message: string, details?: Record): void; warn?(message: string, details?: Record): void; error?(message: string, details?: Record): void; } export interface QuestBoardRepository { /** Stable project-local board path, currently /.pi/pi-materia/quest-board.json. */ readonly boardPath: string; loadOrCreate(): Promise; save(board: QuestBoard): Promise; } export interface EnvironmentLookup { get(name: string): string | undefined; }