Initial commit to new repository

This commit is contained in:
2026-04-03 18:23:52 +09:00
commit deffb33cf9
5248 changed files with 267762 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,159 @@
using System.Text.Json.Serialization;
namespace AxCopilot.Models;
/// <summary>대화 주제 카테고리.</summary>
public static class ChatCategory
{
public const string General = "일반";
public const string Management = "경영";
public const string HR = "인사";
public const string Finance = "재무";
public const string RnD = "연구개발";
public const string Product = "제품분석";
public const string Yield = "수율분석";
public const string MfgTech = "제조기술";
public const string System = "시스템";
public static readonly (string Key, string Label, string Symbol, string Color)[] All =
{
(General, "일반", "\uE8BD", "#6B7280"), // Chat gray
(Management, "경영", "\uE902", "#8B5CF6"), // Briefcase purple
(HR, "인사", "\uE716", "#0EA5E9"), // People sky blue
(Finance, "재무", "\uE8C7", "#D97706"), // Money amber/orange
(RnD, "연구개발", "\uE9A8", "#3B82F6"), // Research blue
(Product, "제품분석", "\uE9D9", "#EC4899"), // Design pink
(Yield, "수율분석", "\uE9F9", "#F59E0B"), // Analytics amber
(MfgTech, "제조기술", "\uE90F", "#10B981"), // Manufacturing emerald
(System, "시스템", "\uE770", "#EF4444"), // IT System red
};
public static string GetSymbol(string? category)
{
if (string.IsNullOrEmpty(category)) return "\uE8BD";
foreach (var (key, _, symbol, _) in All)
if (key == category) return symbol;
return "\uE8BD";
}
public static string GetColor(string? category)
{
if (string.IsNullOrEmpty(category)) return "#6B7280";
foreach (var (key, _, _, color) in All)
if (key == category) return color;
return "#6B7280";
}
}
/// <summary>하나의 대화(세션). 복수의 메시지를 포함합니다.</summary>
public class ChatConversation
{
[JsonPropertyName("id")]
public string Id { get; set; } = Guid.NewGuid().ToString("N");
[JsonPropertyName("title")]
public string Title { get; set; } = "새 대화";
[JsonPropertyName("createdAt")]
public DateTime CreatedAt { get; set; } = DateTime.Now;
[JsonPropertyName("updatedAt")]
public DateTime UpdatedAt { get; set; } = DateTime.Now;
[JsonPropertyName("pinned")]
public bool Pinned { get; set; } = false;
/// <summary>대화가 속한 탭. "Chat" | "Cowork" | "Code".</summary>
[JsonPropertyName("tab")]
public string Tab { get; set; } = "Chat";
/// <summary>대화 주제. ChatCategory 상수 중 하나.</summary>
[JsonPropertyName("category")]
public string Category { get; set; } = ChatCategory.General;
/// <summary>사용자가 보이지 않는 시스템 명령어 (대화별 커스텀 프롬프트).</summary>
[JsonPropertyName("systemCommand")]
public string SystemCommand { get; set; } = "";
/// <summary>대화에 연결된 작업 폴더 경로.</summary>
[JsonPropertyName("workFolder")]
public string WorkFolder { get; set; } = "";
/// <summary>첫 사용자 메시지 요약 (검색용, 최대 100자). 저장 시 자동 갱신.</summary>
[JsonPropertyName("preview")]
public string Preview { get; set; } = "";
/// <summary>분기 원본 대화 ID. null이면 원본 대화.</summary>
[JsonPropertyName("parentId")]
public string? ParentId { get; set; }
/// <summary>분기 라벨 (예: "대안 A", "접근법 2").</summary>
[JsonPropertyName("branchLabel")]
public string? BranchLabel { get; set; }
/// <summary>분기 시점의 메시지 인덱스 (parentId의 Messages[index] 이후부터 분기).</summary>
[JsonPropertyName("branchAtIndex")]
public int? BranchAtIndex { get; set; }
// ─── 대화별 설정 (하단 바에서 변경, 대화마다 독립 저장) ───
/// <summary>파일 접근 권한. null이면 전역 설정 사용. "Auto" | "Ask" | "Deny"</summary>
[JsonPropertyName("permission")]
public string? Permission { get; set; }
/// <summary>데이터 활용 모드. null이면 전역 설정 사용. "active" | "passive" | "none"</summary>
[JsonPropertyName("dataUsage")]
public string? DataUsage { get; set; }
/// <summary>출력 포맷. null이면 전역 설정 사용.</summary>
[JsonPropertyName("outputFormat")]
public string? OutputFormat { get; set; }
/// <summary>무드/디자인 템플릿. null이면 전역 설정 사용.</summary>
[JsonPropertyName("mood")]
public string? Mood { get; set; }
[JsonPropertyName("messages")]
public List<ChatMessage> Messages { get; set; } = new();
}
/// <summary>대화 내 개별 메시지.</summary>
public class ChatMessage
{
[JsonPropertyName("role")]
public string Role { get; set; } = "user"; // "user" | "assistant" | "system"
[JsonPropertyName("content")]
public string Content { get; set; } = "";
[JsonPropertyName("timestamp")]
public DateTime Timestamp { get; set; } = DateTime.Now;
/// <summary>피드백 상태. null=없음, "like", "dislike"</summary>
[JsonPropertyName("feedback")]
public string? Feedback { get; set; }
/// <summary>첨부된 파일 경로 목록.</summary>
[JsonPropertyName("attachedFiles")]
public List<string>? AttachedFiles { get; set; }
/// <summary>첨부된 이미지 목록. base64 인코딩된 이미지 데이터.</summary>
[JsonPropertyName("images")]
public List<ImageAttachment>? Images { get; set; }
}
/// <summary>이미지 첨부 데이터. LLM Vision API에 전달되는 base64 인코딩 이미지.</summary>
public class ImageAttachment
{
/// <summary>base64 인코딩된 이미지 데이터.</summary>
[JsonPropertyName("base64")]
public string Base64 { get; set; } = "";
/// <summary>MIME 타입. image/png, image/jpeg 등.</summary>
[JsonPropertyName("mimeType")]
public string MimeType { get; set; } = "image/png";
/// <summary>원본 파일명 또는 설명.</summary>
[JsonPropertyName("fileName")]
public string FileName { get; set; } = "";
}

View File

@@ -0,0 +1,42 @@
using System.Text.Json.Serialization;
namespace AxCopilot.Models;
/// <summary>
/// 하루치 사용 통계. %APPDATA%\AxCopilot\stats\YYYY-MM-DD.json 에 저장됩니다.
/// </summary>
public class DailyUsageStats
{
[JsonPropertyName("date")]
public string Date { get; set; } = "";
/// <summary>런처가 호출된 횟수 (단축키 누름 횟수)</summary>
[JsonPropertyName("launcherOpens")]
public int LauncherOpens { get; set; }
/// <summary>명령어별 실행 횟수. key = 프리픽스 포함 명령 문자열 (예: "/lock", "calc")</summary>
[JsonPropertyName("commandUsage")]
public Dictionary<string, int> CommandUsage { get; set; } = new();
/// <summary>PC 잠금 해제 후 활성 상태였던 누적 시간 (초)</summary>
[JsonPropertyName("activeSeconds")]
public int ActiveSeconds { get; set; }
// ─── AX Agent 통계 ──────────────────────────────────────────────────
/// <summary>탭별 대화 횟수. key = "Chat" | "Cowork" | "Code"</summary>
[JsonPropertyName("chatCounts")]
public Dictionary<string, int> ChatCounts { get; set; } = new();
/// <summary>일별 총 사용 토큰 수 (Prompt + Completion).</summary>
[JsonPropertyName("totalTokens")]
public long TotalTokens { get; set; }
/// <summary>일별 프롬프트 토큰 수.</summary>
[JsonPropertyName("promptTokens")]
public long PromptTokens { get; set; }
/// <summary>일별 완료 토큰 수.</summary>
[JsonPropertyName("completionTokens")]
public long CompletionTokens { get; set; }
}

View File

@@ -0,0 +1,46 @@
using System.Text.Json.Serialization;
namespace AxCopilot.Models;
/// <summary>MCP 서버 연결 설정.</summary>
public class McpServerEntry
{
[JsonPropertyName("name")]
public string Name { get; set; } = "";
[JsonPropertyName("command")]
public string Command { get; set; } = "";
[JsonPropertyName("args")]
public List<string> Args { get; set; } = new();
[JsonPropertyName("env")]
public Dictionary<string, string> Env { get; set; } = new();
[JsonPropertyName("enabled")]
public bool Enabled { get; set; } = true;
/// <summary>연결 방식: stdio | sse</summary>
[JsonPropertyName("transport")]
public string Transport { get; set; } = "stdio";
/// <summary>SSE 방식일 때 서버 URL.</summary>
[JsonPropertyName("url")]
public string? Url { get; set; }
}
/// <summary>MCP 도구 정의 (서버에서 수신).</summary>
public class McpToolDefinition
{
public string Name { get; set; } = "";
public string Description { get; set; } = "";
public string ServerName { get; set; } = "";
public Dictionary<string, McpParameterDef> Parameters { get; set; } = new();
}
public class McpParameterDef
{
public string Type { get; set; } = "string";
public string Description { get; set; } = "";
public bool Required { get; set; } = false;
}