Files
makelore/shared/coding-project-contracts.ts

78 lines
2.0 KiB
TypeScript

import type { ProjectAgentResponsibility, ProjectType } from './project-config';
import type { ConversationModelState } from './coding-conversation-contracts';
export interface CodingProjectSummary {
id: string;
name: string;
createdAt: string;
updatedAt: string;
lastOpenedAt: string;
}
export type ProjectIdentityChoice =
| { kind: 'create' }
| { kind: 'bind'; projectId: string };
export interface CodingProjectAgent extends ConversationModelState {
id: string;
avatarId: string;
avatarDataUrl?: string;
roleName: string;
name: string;
builtIn: boolean;
enabled: boolean;
skillIds: string[];
responsibility: ProjectAgentResponsibility;
prompt: string;
archivedAt: string | null;
pinned: boolean;
createdAt: string;
updatedAt: string;
}
export interface CodingProjectConfig {
schemaVersion: 2;
projectType: ProjectType;
projectId?: string;
initialized: boolean;
agents: CodingProjectAgent[];
knowledgeDirectory: 'knowledge';
createdAt: string;
updatedAt: string;
}
export interface CodingConversationMetadata extends ConversationModelState {
id: string;
agentId: string;
title: string;
archivedAt: string | null;
unread: boolean;
createdAt: string;
updatedAt: string;
}
export interface CodingProjectConfigSnapshot {
project: CodingProjectSummary;
config: CodingProjectConfig;
knowledgeFiles: string[];
}
export function isCodingProjectAgentReady(agent: CodingProjectAgent): boolean {
return agent.enabled
&& agent.archivedAt === null
&& agent.name.trim().length > 0
&& agent.avatarId.trim().length > 0
&& agent.roleName.trim().length > 0
&& agent.responsibility.mission.trim().length > 0
&& agent.modelResolution === 'resolved'
&& agent.model !== null;
}
export function hasReadyCodingProjectAgent(config: CodingProjectConfig): boolean {
return config.agents.some(isCodingProjectAgentReady);
}
export function isCodingProjectConversationReady(config: CodingProjectConfig): boolean {
return config.initialized && hasReadyCodingProjectAgent(config);
}