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

BIN
src/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net48</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<LangVersion>latest</LangVersion>
<Nullable>annotations</Nullable>
<AssemblyName>AxCopilot_Setup</AssemblyName>
<ApplicationIcon>..\AxCopilot\Assets\icon.ico</ApplicationIcon>
<Version>1.8.0</Version>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
</ItemGroup>
<!-- 본체 ZIP 내장 (build.bat가 payload.zip 생성) -->
<ItemGroup>
<EmbeddedResource Include="payload.zip" Condition="Exists('payload.zip')">
<LogicalName>payload.zip</LogicalName>
</EmbeddedResource>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,297 @@
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace AxCopilot.Installer.Offline
{
/// <summary>
/// WinForms 기본 MessageBox 대체 커스텀 다이얼로그.
/// 인스톨러 테마와 일관된 모던 디자인을 제공합니다.
/// </summary>
internal sealed class CustomMessageBox : Form
{
private DialogResult _result = DialogResult.Cancel;
private static readonly Color BgColor = Color.FromArgb(26, 27, 46);
private static readonly Color CardBg = Color.FromArgb(42, 43, 64);
private static readonly Color AccentCol = Color.FromArgb(75, 94, 252);
private static readonly Color TextCol = Color.FromArgb(224, 228, 240);
private static readonly Color SecondaryCol = Color.FromArgb(153, 153, 187);
private static readonly Color BorderCol = Color.FromArgb(60, 62, 90);
private CustomMessageBox(string message, string title, MessageBoxButtons buttons, MessageBoxIcon icon)
{
Text = title;
FormBorderStyle = FormBorderStyle.None;
StartPosition = FormStartPosition.CenterScreen;
BackColor = BgColor;
DoubleBuffered = true;
ShowInTaskbar = false;
TopMost = true;
// ── 레이아웃을 TableLayoutPanel으로 구성 (겹침 방지) ──
var table = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 1,
RowCount = 3,
Padding = new Padding(28, 24, 28, 20),
BackColor = Color.Transparent,
AutoSize = true,
};
table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100));
table.RowStyles.Add(new RowStyle(SizeType.AutoSize)); // 제목
table.RowStyles.Add(new RowStyle(SizeType.AutoSize)); // 메시지
table.RowStyles.Add(new RowStyle(SizeType.AutoSize)); // 버튼
// ── Row 0: 아이콘 + 제목 ──
var titlePanel = new FlowLayoutPanel
{
FlowDirection = FlowDirection.LeftToRight,
AutoSize = true,
WrapContents = false,
Margin = new Padding(0, 0, 0, 12),
BackColor = Color.Transparent,
};
var iconText = GetIconPrefix(icon);
if (!string.IsNullOrEmpty(iconText))
{
titlePanel.Controls.Add(new Label
{
Text = iconText,
Font = new Font("Segoe UI", 14f),
ForeColor = GetIconColor(icon),
AutoSize = true,
Margin = new Padding(0, 0, 8, 0),
});
}
titlePanel.Controls.Add(new Label
{
Text = title,
Font = new Font("Segoe UI", 12f, FontStyle.Bold),
ForeColor = TextCol,
AutoSize = true,
MaximumSize = new Size(340, 0),
});
table.Controls.Add(titlePanel, 0, 0);
// ── Row 1: 메시지 본문 ──
var msgLabel = new Label
{
Text = message,
Font = new Font("Segoe UI", 10f),
ForeColor = TextCol,
AutoSize = true,
MaximumSize = new Size(360, 300),
Margin = new Padding(0, 0, 0, 20),
};
table.Controls.Add(msgLabel, 0, 1);
// ── Row 2: 버튼 영역 ──
var btnPanel = new FlowLayoutPanel
{
FlowDirection = FlowDirection.RightToLeft,
AutoSize = true,
WrapContents = false,
Anchor = AnchorStyles.Right,
Margin = new Padding(0),
BackColor = Color.Transparent,
};
switch (buttons)
{
case MessageBoxButtons.OK:
btnPanel.Controls.Add(CreateButton("확인", true, DialogResult.OK));
break;
case MessageBoxButtons.OKCancel:
btnPanel.Controls.Add(CreateButton("확인", true, DialogResult.OK));
btnPanel.Controls.Add(CreateButton("취소", false, DialogResult.Cancel));
break;
case MessageBoxButtons.YesNo:
btnPanel.Controls.Add(CreateButton("예", true, DialogResult.Yes));
btnPanel.Controls.Add(CreateButton("아니오", false, DialogResult.No));
break;
case MessageBoxButtons.YesNoCancel:
btnPanel.Controls.Add(CreateButton("예", true, DialogResult.Yes));
btnPanel.Controls.Add(CreateButton("아니오", false, DialogResult.No));
btnPanel.Controls.Add(CreateButton("취소", false, DialogResult.Cancel));
break;
}
table.Controls.Add(btnPanel, 0, 2);
Controls.Add(table);
// ── 크기 계산 (AutoSize 후) ──
table.PerformLayout();
var preferred = table.PreferredSize;
ClientSize = new Size(
Math.Max(380, Math.Min(preferred.Width + 10, 520)),
Math.Min(preferred.Height + 10, 500)
);
// 드래그 이동
table.MouseDown += DragForm;
titlePanel.MouseDown += DragForm;
msgLabel.MouseDown += DragForm;
// ESC / Enter
KeyPreview = true;
KeyDown += (s, e) =>
{
if (e.KeyCode == Keys.Escape)
{
_result = buttons == MessageBoxButtons.YesNo ? DialogResult.No : DialogResult.Cancel;
Close();
}
else if (e.KeyCode == Keys.Enter)
{
_result = (buttons == MessageBoxButtons.YesNo || buttons == MessageBoxButtons.YesNoCancel)
? DialogResult.Yes : DialogResult.OK;
Close();
}
};
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Region 클리핑 (약간 더 큰 반경으로 잘림 줄임)
using var clipPath = RoundRect(new Rectangle(0, 0, Width, Height), 18);
Region = new Region(clipPath);
var g = e.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
// 배경 채우기 (Region 가장자리 보정)
using var bgBrush = new SolidBrush(BgColor);
using var bgPath = RoundRect(new Rectangle(0, 0, Width, Height), 18);
g.FillPath(bgBrush, bgPath);
// 테두리 (안쪽 1.5px, 부드러운 선)
using var borderPen = new Pen(Color.FromArgb(80, 90, 140), 1.5f);
using var borderPath = RoundRect(new Rectangle(1, 1, Width - 3, Height - 3), 16);
g.DrawPath(borderPen, borderPath);
}
private Button CreateButton(string text, bool isPrimary, DialogResult result)
{
var btn = new Button
{
Text = text,
Font = new Font("Segoe UI", 10f, isPrimary ? FontStyle.Bold : FontStyle.Regular),
ForeColor = TextCol,
BackColor = isPrimary ? AccentCol : CardBg,
FlatStyle = FlatStyle.Flat,
Size = new Size(90, 36),
Margin = new Padding(4, 0, 4, 0),
Cursor = Cursors.Hand,
};
btn.FlatAppearance.BorderSize = 0;
btn.Click += (s, e) => { _result = result; Close(); };
btn.Paint += (s, pe) =>
{
using var clipPath = RoundRect(new Rectangle(0, 0, btn.Width, btn.Height), 10);
btn.Region = new Region(clipPath);
var g = pe.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
// 배경
using var fillBrush = new SolidBrush(btn.BackColor);
using var fillPath = RoundRect(new Rectangle(0, 0, btn.Width, btn.Height), 10);
g.FillPath(fillBrush, fillPath);
// 테두리
using var bPen = new Pen(Color.FromArgb(70, 255, 255, 255), 0.8f);
using var bPath = RoundRect(new Rectangle(0, 0, btn.Width - 1, btn.Height - 1), 10);
g.DrawPath(bPen, bPath);
// 텍스트 직접 그리기
var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
using var textBrush = new SolidBrush(btn.ForeColor);
g.DrawString(btn.Text, btn.Font, textBrush, new RectangleF(0, 0, btn.Width, btn.Height), sf);
};
return btn;
}
private static string GetIconPrefix(MessageBoxIcon icon)
{
return icon switch
{
MessageBoxIcon.Error => "✕",
MessageBoxIcon.Warning => "⚠",
MessageBoxIcon.Information => "",
MessageBoxIcon.Question => "?",
_ => "",
};
}
private static Color GetIconColor(MessageBoxIcon icon)
{
return icon switch
{
MessageBoxIcon.Error => Color.FromArgb(229, 62, 62),
MessageBoxIcon.Warning => Color.FromArgb(221, 107, 32),
MessageBoxIcon.Information => Color.FromArgb(75, 94, 252),
MessageBoxIcon.Question => Color.FromArgb(75, 94, 252),
_ => TextCol,
};
}
private void DragForm(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
NativeMethods.ReleaseCapture();
NativeMethods.SendMessage(Handle, 0xA1, (IntPtr)0x2, IntPtr.Zero);
}
}
private static GraphicsPath RoundRect(Rectangle rect, int radius)
{
var path = new GraphicsPath();
var d = radius * 2;
path.AddArc(rect.X, rect.Y, d, d, 180, 90);
path.AddArc(rect.Right - d, rect.Y, d, d, 270, 90);
path.AddArc(rect.Right - d, rect.Bottom - d, d, d, 0, 90);
path.AddArc(rect.X, rect.Bottom - d, d, d, 90, 90);
path.CloseFigure();
return path;
}
private static class NativeMethods
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
}
// ─── 정적 호출 메서드 (기존 MessageBox.Show 호환) ───────────────
public static DialogResult Show(string message)
=> Show(message, "AX Copilot", MessageBoxButtons.OK, MessageBoxIcon.None);
public static DialogResult Show(string message, string title)
=> Show(message, title, MessageBoxButtons.OK, MessageBoxIcon.None);
public static DialogResult Show(string message, string title, MessageBoxButtons buttons)
=> Show(message, title, buttons, MessageBoxIcon.None);
public static DialogResult Show(string message, string title, MessageBoxButtons buttons, MessageBoxIcon icon)
{
var dlg = new CustomMessageBox(message, title, buttons, icon);
dlg.ShowDialog();
return dlg._result;
}
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Windows.Forms;
namespace AxCopilot.Installer.Offline
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SetupForm());
}
}
}

View File

@@ -0,0 +1,324 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.IO.Compression;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;
namespace AxCopilot.Installer.Offline
{
public class SetupForm : Form
{
private const string AppName = "AX Copilot";
private const string AppVer = "1.8.0";
private const string Org = "AX\uC5F0\uAD6C\uC18C AI\uD300";
private const string RegUn = @"Software\Microsoft\Windows\CurrentVersion\Uninstall\AxCopilot";
private const string RegRun = @"Software\Microsoft\Windows\CurrentVersion\Run";
private TextBox _pathBox;
private Label _status, _existLbl;
private Panel _existPnl, _progPnl;
private ProgressBar _prog;
private CheckBox _chkDesk, _chkAuto, _chkReg;
private Button _btnInst, _btnCanc, _btnBrowse, _btnDel;
private string _exPath, _exVer;
private static readonly string DefPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "AX Copilot");
[DllImport("gdi32.dll")] static extern IntPtr CreateRoundRectRgn(int a,int b,int c,int d,int e,int f);
[DllImport("user32.dll")] static extern int SetWindowRgn(IntPtr h,IntPtr r,bool re);
public SetupForm()
{
Text = AppName + " Setup"; Size = new Size(520, 470);
StartPosition = FormStartPosition.CenterScreen;
try { var ico = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location); if (ico != null) Icon = ico; } catch { }
FormBorderStyle = FormBorderStyle.None; DoubleBuffered = true;
BackColor = Color.FromArgb(248, 249, 255);
Build(); Detect();
}
protected override void OnShown(EventArgs e)
{ base.OnShown(e); SetWindowRgn(Handle, CreateRoundRectRgn(0,0,Width,Height,20,20), true); }
// drag
private Point _ds; private bool _dg;
protected override void OnMouseDown(MouseEventArgs e) { if(e.Button==MouseButtons.Left&&e.Y<82){_dg=true;_ds=e.Location;} }
protected override void OnMouseMove(MouseEventArgs e) { if(_dg){var p=PointToScreen(e.Location);Location=new Point(p.X-_ds.X,p.Y-_ds.Y);} }
protected override void OnMouseUp(MouseEventArgs e) { _dg=false; }
protected override void OnMouseClick(MouseEventArgs e) { if(e.X>Width-40&&e.Y<30)Close(); }
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics; g.SmoothingMode = SmoothingMode.AntiAlias;
var hr = new Rectangle(0,0,Width,82);
using(var hb = new LinearGradientBrush(hr, Color.FromArgb(46,58,140), Color.FromArgb(75,94,252), 0f))
g.FillRectangle(hb, hr);
// Diamond icon in header (둥근 모서리)
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.TranslateTransform(40, 30);
g.RotateTransform(45);
FillRoundRect(g, new SolidBrush(Color.FromArgb(68,136,255)), 0, 0, 9, 9, 2.5f); // 상: Blue
FillRoundRect(g, new SolidBrush(Color.FromArgb(68,221,102)), 11, 0, 9, 9, 2.5f); // 우: Green
FillRoundRect(g, new SolidBrush(Color.FromArgb(68,221,102)), 0, 11, 9, 9, 2.5f); // 좌: Green
FillRoundRect(g, new SolidBrush(Color.FromArgb(255,68,102)), 11, 11, 9, 9, 2.5f); // 하: Red
g.ResetTransform();
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default;
using(var f1 = new Font("Segoe UI",18f,FontStyle.Bold)) g.DrawString(AppName,f1,Brushes.White,60,16);
using(var f2 = new Font("Segoe UI",9f))
g.DrawString(Org + " \u00b7 v" + AppVer,
f2, new SolidBrush(Color.FromArgb(170,187,255)), 60, 50);
using(var fc = new Font("Segoe UI",14f)) g.DrawString("\u00d7",fc,new SolidBrush(Color.FromArgb(140,170,204,255)),Width-30,4);
using(var pen = new Pen(Color.FromArgb(220,220,240))) g.DrawLine(pen,0,Height-56,Width,Height-56);
}
private void Build()
{
int y = 94;
_existPnl = new Panel{Left=20,Top=y,Width=Width-40,Height=30,BackColor=Color.FromArgb(255,248,225),Visible=false};
_existLbl = new Label{Dock=DockStyle.Fill,ForeColor=Color.FromArgb(146,64,14),Font=new Font("Segoe UI",9f),
TextAlign=ContentAlignment.MiddleLeft,Padding=new Padding(8,0,0,0)};
_existPnl.Controls.Add(_existLbl); Controls.Add(_existPnl); y+=38;
Controls.Add(new Label{Text="\uC124\uCE58 \uACBD\uB85C",Left=24,Top=y,AutoSize=true,
Font=new Font("Segoe UI",9.5f,FontStyle.Bold),ForeColor=Color.FromArgb(51,51,102)}); y+=22;
_pathBox = new TextBox{Left=24,Top=y,Width=Width-110,Height=26,Font=new Font("Consolas",10f),
Text=DefPath,BorderStyle=BorderStyle.FixedSingle};
Controls.Add(_pathBox);
_btnBrowse = Btn("\uBCC0\uACBD",Color.FromArgb(238,240,255),Color.FromArgb(75,94,252),Width-80,y-1,56,28);
_btnBrowse.Click += (s,ev)=>{using(var d=new FolderBrowserDialog{SelectedPath=_pathBox.Text})
if(d.ShowDialog()==DialogResult.OK)_pathBox.Text=d.SelectedPath;};
Controls.Add(_btnBrowse); y+=34;
Controls.Add(new Label{Text="\uBCF8\uCCB4 + .NET Runtime \uBAA8\uB450 \uB0B4\uC7A5 (\uC778\uD130\uB137 \uBD88\uD544\uC694)",
Left=24,Top=y,AutoSize=true,
Font=new Font("Segoe UI",8f),ForeColor=Color.FromArgb(153,153,187)}); y+=24;
_chkDesk = Chk("\uBC14\uD0D5\uD654\uBA74 \uBC14\uB85C\uAC00\uAE30 \uC0DD\uC131",true,24,y); y+=24;
_chkAuto = Chk("Windows \uC2DC\uC791 \uC2DC \uC790\uB3D9 \uC2E4\uD589",true,24,y); y+=24;
_chkReg = Chk("\uD504\uB85C\uADF8\uB7A8 \uCD94\uAC00/\uC81C\uAC70\uC5D0 \uB4F1\uB85D",true,24,y); y+=36;
_progPnl = new Panel{Left=20,Top=y,Width=Width-40,Height=42,Visible=false};
_status = new Label{Dock=DockStyle.Top,Height=20,Font=new Font("Segoe UI",9f),ForeColor=Color.FromArgb(75,94,252)};
_prog = new ProgressBar{Dock=DockStyle.Bottom,Height=10,Style=ProgressBarStyle.Continuous};
_progPnl.Controls.Add(_prog); _progPnl.Controls.Add(_status); Controls.Add(_progPnl);
int fy = Height-44;
Controls.Add(new Label{Text="v"+AppVer,Left=24,Top=fy+4,AutoSize=true,
Font=new Font("Segoe UI",8f),ForeColor=Color.FromArgb(187,187,204)});
_btnDel = Btn("\uC81C\uAC70",Color.FromArgb(254,226,226),Color.FromArgb(220,38,38),Width-270,fy,60,32);
_btnDel.Visible=false; _btnDel.Click+=async(s,ev)=>await Uninstall(); Controls.Add(_btnDel);
_btnCanc = Btn("\uCDE8\uC18C",Color.FromArgb(240,240,248),Color.FromArgb(102,102,136),Width-200,fy,68,32);
_btnCanc.Click+=(s,ev)=>Close(); Controls.Add(_btnCanc);
_btnInst = Btn("\uC124\uCE58",Color.FromArgb(75,94,252),Color.White,Width-122,fy,100,32);
_btnInst.Click+=async(s,ev)=>await Install(); Controls.Add(_btnInst);
}
private CheckBox Chk(string t,bool c,int x,int y){var cb=new CheckBox{Text=t,Checked=c,Left=x,Top=y,AutoSize=true,
Font=new Font("Segoe UI",9.5f),ForeColor=Color.FromArgb(85,85,119)};Controls.Add(cb);return cb;}
private Button Btn(string t,Color bg,Color fg,int x,int y,int w,int h){var b=new Button{Text=t,Left=x,Top=y,Width=w,Height=h,
FlatStyle=FlatStyle.Flat,BackColor=bg,ForeColor=fg,Font=new Font("Segoe UI",9.5f,FontStyle.Bold),Cursor=Cursors.Hand};
b.FlatAppearance.BorderSize=0;return b;}
private void Detect()
{
try{using(var k=Registry.CurrentUser.OpenSubKey(RegUn)){
_exPath=k!=null?k.GetValue("InstallLocation") as string:null;
_exVer=k!=null?k.GetValue("DisplayVersion") as string:null;}}catch{}
if(!string.IsNullOrEmpty(_exPath)&&Directory.Exists(_exPath)){
_pathBox.Text=_exPath;_existPnl.Visible=true;
_existLbl.Text=" \u26A0 \uAE30\uC874: v"+(_exVer??"")+" \u2014 "+_exPath;
_btnInst.Text="\uC5C5\uADF8\uB808\uC774\uB4DC";_btnDel.Visible=true;}
}
private async Task Install()
{
var path = _pathBox.Text.Trim();
if(string.IsNullOrEmpty(path)){CustomMessageBox.Show("\uC124\uCE58 \uACBD\uB85C\uB97C \uC785\uB825\uD558\uC138\uC694.");return;}
Busy(true);
try
{
St("앱 종료...",5); Kill(); await Task.Delay(500);
// ── 기존 AX Commander 마이그레이션 ──
MigrateFromAxCommander();
St("파일 설치...",20);
Directory.CreateDirectory(path);
ExtractZip(path);
await Task.Delay(300);
if(_chkDesk.Checked){St("바로가기...",60);
Lnk(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"AX Copilot.lnk"),
Path.Combine(path,"AxCopilot.exe"));}
St("시작 메뉴...",70);
var sm=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),"Programs","AX Copilot");
Directory.CreateDirectory(sm);
Lnk(Path.Combine(sm,"AX Copilot.lnk"),Path.Combine(path,"AxCopilot.exe"));
if(_chkAuto.Checked){St("\uC790\uB3D9 \uC2E4\uD589...",80);
using(var k=Registry.CurrentUser.OpenSubKey(RegRun,true)){if(k!=null)k.SetValue("AxCopilot","\""+Path.Combine(path,"AxCopilot.exe")+"\"");}}
// 인스톨러를 설치 폴더에 복사 (제거 기능용)
St("제거 프로그램 등록...",85);
try{var me=Assembly.GetExecutingAssembly().Location;
var dest=Path.Combine(path,"AxCopilot_Setup.exe");
if(!string.Equals(me,dest,StringComparison.OrdinalIgnoreCase))
File.Copy(me,dest,true);}catch{}
if(_chkReg.Checked){St("\uD504\uB85C\uADF8\uB7A8 \uB4F1\uB85D...",90);RegAdd(path);}
St("\uC124\uCE58 \uC644\uB8CC!",100); await Task.Delay(400);
if(CustomMessageBox.Show(AppName+" \uC124\uCE58 \uC644\uB8CC!\n\n"+Path.Combine(path,"AxCopilot.exe")+"\n\n\uC2E4\uD589\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",
AppName,MessageBoxButtons.YesNo,MessageBoxIcon.Information)==DialogResult.Yes)
Process.Start(new ProcessStartInfo(Path.Combine(path,"AxCopilot.exe")){UseShellExecute=true});
Close();
}
catch(UnauthorizedAccessException){CustomMessageBox.Show("관리자 권한이 필요합니다.\n다른 경로를 선택하거나 관리자로 실행하세요.");Busy(false);}
catch(Exception ex){CustomMessageBox.Show("\uC124\uCE58 \uC2E4\uD328:\n"+ex.Message);Busy(false);}
}
private async Task Uninstall()
{
if(string.IsNullOrEmpty(_exPath))return;
if(CustomMessageBox.Show("\uC81C\uAC70\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?\n\n"+_exPath+"\n\n\uC124\uC815(%APPDATA%)\uC740 \uC720\uC9C0\uB429\uB2C8\uB2E4.",
AppName+" \uC81C\uAC70",MessageBoxButtons.YesNo,MessageBoxIcon.Question)!=DialogResult.Yes)return;
Busy(true);
try{
St("\uC571 \uC885\uB8CC...",10);Kill();await Task.Delay(500);
St("\uD30C\uC77C \uC0AD\uC81C...",30);
if(Directory.Exists(_exPath)){try{Directory.Delete(_exPath,true);}catch{
foreach(var f in Directory.GetFiles(_exPath))try{File.Delete(f);}catch{}}}
St("\uBC14\uB85C\uAC00\uAE30 \uC0AD\uC81C...",55);
Del(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"AX Copilot.lnk"));
Del(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),"AX Commander.lnk")); // 레거시
var sm=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),"Programs","AX Copilot");
try{var smOld=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu),"Programs","AX Commander");if(Directory.Exists(smOld))Directory.Delete(smOld,true);}catch{}
try{if(Directory.Exists(sm))Directory.Delete(sm,true);}catch{}
St("\uB808\uC9C0\uC2A4\uD2B8\uB9AC...",75);
try{using(var k=Registry.CurrentUser.OpenSubKey(RegRun,true)){if(k!=null)k.DeleteValue("AxCopilot",false);}}catch{}
try{Registry.CurrentUser.DeleteSubKey(RegUn,false);}catch{}
St("\uC81C\uAC70 \uC644\uB8CC!",100);await Task.Delay(400);
CustomMessageBox.Show("\uC81C\uAC70 \uC644\uB8CC.\n\uC124\uC815: %APPDATA%\\AxCopilot",AppName);Close();
}catch(Exception ex){CustomMessageBox.Show("\uC81C\uAC70 \uC2E4\uD328:"+ex.Message);Busy(false);}
}
private void Busy(bool b){_btnInst.Enabled=!b;_btnCanc.Enabled=!b;_btnDel.Enabled=!b;_progPnl.Visible=b;}
private void St(string t,int p){_status.Text=t;_prog.Value=Math.Min(p,100);Application.DoEvents();}
private static void Kill()
{
foreach(var p in Process.GetProcessesByName("AxCopilot"))try{p.Kill();p.WaitForExit(3000);}catch{}
foreach(var p in Process.GetProcessesByName("AxCommander"))try{p.Kill();p.WaitForExit(3000);}catch{} // 레거시
}
private static void Del(string f){try{if(File.Exists(f))File.Delete(f);}catch{}}
/// <summary>기존 AX Commander 설치를 감지하여 정리 + AppData 마이그레이션</summary>
private void MigrateFromAxCommander()
{
const string OldRegUn = @"Software\Microsoft\Windows\CurrentVersion\Uninstall\AxCommander";
try
{
using var oldKey = Registry.CurrentUser.OpenSubKey(OldRegUn, false);
if (oldKey == null) return; // 기존 설치 없음
St("AX Commander → AX Copilot 업그레이드...", 8);
// 기존 설치 폴더 삭제
var oldPath = oldKey.GetValue("InstallLocation") as string;
if (!string.IsNullOrEmpty(oldPath) && Directory.Exists(oldPath))
try { Directory.Delete(oldPath, true); } catch { }
// 기존 바로가기 삭제
Del(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "AX Commander.lnk"));
var oldSm = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu), "Programs", "AX Commander");
try { if (Directory.Exists(oldSm)) Directory.Delete(oldSm, true); } catch { }
// 기존 레지스트리 정리
try { using (var k = Registry.CurrentUser.OpenSubKey(RegRun, true)) { k?.DeleteValue("AxCommander", false); } } catch { }
try { Registry.CurrentUser.DeleteSubKey(OldRegUn, false); } catch { }
// %APPDATA%\AxCommander → %APPDATA%\AxCopilot 이동
var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
var oldDir = Path.Combine(appData, "AxCommander");
var newDir = Path.Combine(appData, "AxCopilot");
if (Directory.Exists(oldDir) && !Directory.Exists(newDir))
{
St("설정 데이터 마이그레이션...", 12);
try { Directory.Move(oldDir, newDir); } catch { }
}
St("마이그레이션 완료", 15);
}
catch { }
}
private void ExtractZip(string dest)
{
var asm = Assembly.GetExecutingAssembly();
var names = asm.GetManifestResourceNames();
string name = null;
foreach(var n in names) if(n.IndexOf("payload.zip",StringComparison.OrdinalIgnoreCase)>=0){name=n;break;}
if(name==null)throw new FileNotFoundException("payload.zip not found in embedded resources.");
using(var s = asm.GetManifestResourceStream(name))
using(var zip = new ZipArchive(s, ZipArchiveMode.Read))
{
int total = 0; foreach(var _ in zip.Entries) total++;
int done = 0;
foreach(var entry in zip.Entries)
{
var target = Path.Combine(dest, entry.FullName);
if(string.IsNullOrEmpty(entry.Name)){Directory.CreateDirectory(target);continue;}
var dir = Path.GetDirectoryName(target);
if(dir!=null) Directory.CreateDirectory(dir);
entry.ExtractToFile(target, true);
done++;
int pct = 20 + (done * 35 / Math.Max(total, 1));
St("\uD30C\uC77C \uC124\uCE58... ("+done+"/"+total+")", pct);
}
}
}
private static void FillRoundRect(Graphics g, Brush brush, float x, float y, float w, float h, float r)
{
using var path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddArc(x, y, r * 2, r * 2, 180, 90);
path.AddArc(x + w - r * 2, y, r * 2, r * 2, 270, 90);
path.AddArc(x + w - r * 2, y + h - r * 2, r * 2, r * 2, 0, 90);
path.AddArc(x, y + h - r * 2, r * 2, r * 2, 90, 90);
path.CloseFigure();
g.FillPath(brush, path);
}
private static void Lnk(string lnk,string target)
{
var iconPath = Path.Combine(Path.GetDirectoryName(target)??"", "Assets", "icon.ico");
var iconArg = File.Exists(iconPath) ? "$s.IconLocation='"+iconPath.Replace("'","''")+"';" : "";
var ps="$ws=New-Object -ComObject WScript.Shell;$s=$ws.CreateShortcut('"+lnk.Replace("'","''")+"');"+
"$s.TargetPath='"+target.Replace("'","''")+"';$s.WorkingDirectory='"+Path.GetDirectoryName(target).Replace("'","''")+"';"+
iconArg+"$s.Save()";
Process.Start(new ProcessStartInfo("powershell","-NoProfile -Command \""+ps+"\"")
{CreateNoWindow=true,UseShellExecute=false}).WaitForExit(5000);
}
private static void RegAdd(string dir)
{
try{using(var k=Registry.CurrentUser.CreateSubKey(RegUn)){
k.SetValue("DisplayName",AppName);
k.SetValue("DisplayVersion",AppVer);
k.SetValue("Publisher",Org);
k.SetValue("InstallLocation",dir);
k.SetValue("DisplayIcon",Path.Combine(dir,"AxCopilot.exe")+",0");
k.SetValue("UninstallString","\""+Path.Combine(dir,"AxCopilot_Setup.exe")+"\"");
k.SetValue("InstallDate",DateTime.Now.ToString("yyyyMMdd"));
k.SetValue("NoModify",1,RegistryValueKind.DWord);
k.SetValue("NoRepair",1,RegistryValueKind.DWord);
k.SetValue("EstimatedSize",72000,RegistryValueKind.DWord);}}catch{}
}
}
}

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.1.0" name="AxCopilot.Setup"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>

View File

@@ -0,0 +1,58 @@
{
"format": 1,
"restore": {
"E:\\AX Copilot\\src\\AxCopilot.Installer\\AxCopilot.Installer.csproj": {}
},
"projects": {
"E:\\AX Copilot\\src\\AxCopilot.Installer\\AxCopilot.Installer.csproj": {
"version": "1.7.2",
"restore": {
"projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot.Installer\\AxCopilot.Installer.csproj",
"projectName": "AxCopilot_Setup",
"projectPath": "E:\\AX Copilot\\src\\AxCopilot.Installer\\AxCopilot.Installer.csproj",
"packagesPath": "C:\\Users\\admin\\.nuget\\packages\\",
"outputPath": "E:\\AX Copilot\\src\\AxCopilot.Installer\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\admin\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net48"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net48": {
"targetAlias": "net48",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "10.0.200"
},
"frameworks": {
"net48": {
"targetAlias": "net48",
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201\\RuntimeIdentifierGraph.json"
}
},
"runtimes": {
"win-x86": {
"#import": []
}
}
}
}
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\admin\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\admin\.nuget\packages\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]

View File

@@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("AxCopilot_Setup")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.1.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.1")]
[assembly: System.Reflection.AssemblyProductAttribute("AxCopilot_Setup")]
[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot_Setup")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.7.1.0")]
// MSBuild WriteCodeFragment 클래스에서 생성되었습니다.

View File

@@ -0,0 +1 @@
b0ecaa163a313d5af7b0a607fb1d375c818edd550a5facb1dcab54e47d4ef5ba

View File

@@ -0,0 +1,14 @@
is_global = true
build_property.ApplicationManifest = app.manifest
build_property.StartupObject =
build_property.ApplicationDefaultFont =
build_property.ApplicationHighDpiMode =
build_property.ApplicationUseCompatibleTextRendering =
build_property.ApplicationVisualStyles =
build_property.RootNamespace = AxCopilot.Installer
build_property.ProjectDir = E:\AX Copilot\src\AxCopilot.Installer\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.CsWinRTUseWindowsUIXamlProjections = false
build_property.EffectiveAnalysisLevelStyle =
build_property.EnableCodeStyleSeverity =

View File

@@ -0,0 +1 @@
cdeb201644c87f7c493d903f57cc22b1f80777359a33a9d6401d43e2b0005fa8

View File

@@ -0,0 +1,20 @@
E:\AX Commander\src\AxCopilot.Installer\bin\Debug\net48\AxCopilot_Setup.exe.config
E:\AX Commander\src\AxCopilot.Installer\bin\Debug\net48\AxCopilot_Setup.exe
E:\AX Commander\src\AxCopilot.Installer\bin\Debug\net48\AxCopilot_Setup.pdb
E:\AX Commander\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.csproj.AssemblyReference.cache
E:\AX Commander\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.GeneratedMSBuildEditorConfig.editorconfig
E:\AX Commander\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.AssemblyInfoInputs.cache
E:\AX Commander\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.AssemblyInfo.cs
E:\AX Commander\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.csproj.CoreCompileInputs.cache
E:\AX Commander\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot_Setup.exe
E:\AX Commander\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot_Setup.pdb
E:\AX Copilot\src\AxCopilot.Installer\bin\Debug\net48\AxCopilot_Setup.exe.config
E:\AX Copilot\src\AxCopilot.Installer\bin\Debug\net48\AxCopilot_Setup.exe
E:\AX Copilot\src\AxCopilot.Installer\bin\Debug\net48\AxCopilot_Setup.pdb
E:\AX Copilot\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.csproj.AssemblyReference.cache
E:\AX Copilot\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.GeneratedMSBuildEditorConfig.editorconfig
E:\AX Copilot\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.AssemblyInfoInputs.cache
E:\AX Copilot\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.AssemblyInfo.cs
E:\AX Copilot\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot.Installer.csproj.CoreCompileInputs.cache
E:\AX Copilot\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot_Setup.exe
E:\AX Copilot\src\AxCopilot.Installer\obj\Debug\net48\AxCopilot_Setup.pdb

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]

View File

@@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("AxCopilot_Setup")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.7.2.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.7.2")]
[assembly: System.Reflection.AssemblyProductAttribute("AxCopilot_Setup")]
[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot_Setup")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.7.2.0")]
// MSBuild WriteCodeFragment 클래스에서 생성되었습니다.

View File

@@ -0,0 +1 @@
9fc97ba95fb895eafec34720944a95d7ef26ca1178a342b4d606134cf9a22f91

View File

@@ -0,0 +1,14 @@
is_global = true
build_property.ApplicationManifest = app.manifest
build_property.StartupObject =
build_property.ApplicationDefaultFont =
build_property.ApplicationHighDpiMode =
build_property.ApplicationUseCompatibleTextRendering =
build_property.ApplicationVisualStyles =
build_property.RootNamespace = AxCopilot.Installer
build_property.ProjectDir = E:\AX Copilot\src\AxCopilot.Installer\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.CsWinRTUseWindowsUIXamlProjections = false
build_property.EffectiveAnalysisLevelStyle =
build_property.EnableCodeStyleSeverity =

View File

@@ -0,0 +1 @@
d0902e3a45ac1669ecad6c4a76499ce8c92ddecaaca00815b0d092f937f62404

View File

@@ -0,0 +1,10 @@
E:\AX Copilot\src\AxCopilot.Installer\bin\Release\net48\AxCopilot_Setup.exe.config
E:\AX Copilot\src\AxCopilot.Installer\bin\Release\net48\AxCopilot_Setup.exe
E:\AX Copilot\src\AxCopilot.Installer\bin\Release\net48\AxCopilot_Setup.pdb
E:\AX Copilot\src\AxCopilot.Installer\obj\Release\net48\AxCopilot.Installer.csproj.AssemblyReference.cache
E:\AX Copilot\src\AxCopilot.Installer\obj\Release\net48\AxCopilot.Installer.GeneratedMSBuildEditorConfig.editorconfig
E:\AX Copilot\src\AxCopilot.Installer\obj\Release\net48\AxCopilot.Installer.AssemblyInfoInputs.cache
E:\AX Copilot\src\AxCopilot.Installer\obj\Release\net48\AxCopilot.Installer.AssemblyInfo.cs
E:\AX Copilot\src\AxCopilot.Installer\obj\Release\net48\AxCopilot.Installer.csproj.CoreCompileInputs.cache
E:\AX Copilot\src\AxCopilot.Installer\obj\Release\net48\AxCopilot_Setup.exe
E:\AX Copilot\src\AxCopilot.Installer\obj\Release\net48\AxCopilot_Setup.pdb

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
</configuration>

View File

@@ -0,0 +1,64 @@
{
"version": 3,
"targets": {
".NETFramework,Version=v4.8": {},
".NETFramework,Version=v4.8/win-x86": {}
},
"libraries": {},
"projectFileDependencyGroups": {
".NETFramework,Version=v4.8": []
},
"packageFolders": {
"C:\\Users\\admin\\.nuget\\packages\\": {}
},
"project": {
"version": "1.7.2",
"restore": {
"projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot.Installer\\AxCopilot.Installer.csproj",
"projectName": "AxCopilot_Setup",
"projectPath": "E:\\AX Copilot\\src\\AxCopilot.Installer\\AxCopilot.Installer.csproj",
"packagesPath": "C:\\Users\\admin\\.nuget\\packages\\",
"outputPath": "E:\\AX Copilot\\src\\AxCopilot.Installer\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\admin\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net48"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net48": {
"targetAlias": "net48",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "10.0.200"
},
"frameworks": {
"net48": {
"targetAlias": "net48",
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201\\RuntimeIdentifierGraph.json"
}
},
"runtimes": {
"win-x86": {
"#import": []
}
}
}
}

View File

@@ -0,0 +1,8 @@
{
"version": 2,
"dgSpecHash": "szcmjiT3MpM=",
"success": true,
"projectFilePath": "E:\\AX Copilot\\src\\AxCopilot.Installer\\AxCopilot.Installer.csproj",
"expectedPackageFiles": [],
"logs": []
}

View File

@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<AssemblyName>AxCopilot.SDK</AssemblyName>
<RootNamespace>AxCopilot.SDK</RootNamespace>
<Version>1.0.0</Version>
<Authors>AX Copilot</Authors>
<Description>SDK for building AX Copilot plugins</Description>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,55 @@
namespace AxCopilot.SDK;
/// <summary>
/// AX Copilot 플러그인이 구현해야 하는 핵심 인터페이스.
/// 새로운 명령어 타입을 추가하려면 이 인터페이스를 구현하고
/// settings.json의 "plugins" 배열에 .dll 경로를 등록하십시오.
/// </summary>
public interface IActionHandler
{
/// <summary>
/// 이 핸들러를 트리거하는 prefix 문자 (예: "@", "!", "#", "~", ">", "$").
/// null이면 prefix 없이 Fuzzy 검색 결과에만 항목을 제공합니다.
/// </summary>
string? Prefix { get; }
/// <summary>
/// 플러그인 메타데이터
/// </summary>
PluginMetadata Metadata { get; }
/// <summary>
/// 런처 결과 리스트에 표시할 항목을 반환합니다.
/// </summary>
/// <param name="query">prefix 이후의 사용자 입력 텍스트</param>
/// <param name="ct">ESC 입력 시 취소되는 CancellationToken</param>
Task<IEnumerable<LauncherItem>> GetItemsAsync(string query, CancellationToken ct);
/// <summary>
/// 사용자가 항목을 선택(Enter)했을 때 실행되는 동작
/// </summary>
Task ExecuteAsync(LauncherItem item, CancellationToken ct);
}
/// <summary>
/// 런처 결과 리스트에 표시될 단일 항목
/// </summary>
public record LauncherItem(
string Title,
string Subtitle,
string? IconPath, // null이면 기본 아이콘 사용
object? Data, // ExecuteAsync에 전달되는 임의 데이터
string? ActionUrl = null, // Enter 시 열릴 URL (선택)
string? Symbol = null // Segoe MDL2 Assets 유니코드 심볼 (null이면 타입 기반 자동 결정)
);
/// <summary>
/// 플러그인 식별 메타데이터
/// </summary>
public record PluginMetadata(
string Id,
string Name,
string Version,
string Author,
string? Description = null
);

View File

@@ -0,0 +1,23 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"AxCopilot.SDK/1.0.0": {
"runtime": {
"AxCopilot.SDK.dll": {}
}
}
}
},
"libraries": {
"AxCopilot.SDK/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

View File

@@ -0,0 +1,23 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"AxCopilot.SDK/1.0.0": {
"runtime": {
"AxCopilot.SDK.dll": {}
}
}
}
},
"libraries": {
"AxCopilot.SDK/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

View File

@@ -0,0 +1,69 @@
{
"format": 1,
"restore": {
"E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": {}
},
"projects": {
"E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj",
"projectName": "AxCopilot.SDK",
"projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj",
"packagesPath": "C:\\Users\\admin\\.nuget\\packages\\",
"outputPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\admin\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0-windows"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0-windows7.0": {
"targetAlias": "net8.0-windows",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "10.0.200"
},
"frameworks": {
"net8.0-windows7.0": {
"targetAlias": "net8.0-windows",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\admin\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\admin\.nuget\packages\" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -0,0 +1,25 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("AX Copilot")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyDescriptionAttribute("SDK for building AX Copilot plugins")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("AxCopilot.SDK")]
[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot.SDK")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")]
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]
// MSBuild WriteCodeFragment 클래스에서 생성되었습니다.

View File

@@ -0,0 +1 @@
00a35f199608229314e889906ceff92d9c9c44f1bbb5b9f09a74311d19d47810

View File

@@ -0,0 +1,18 @@
is_global = true
build_property.TargetFramework = net8.0-windows
build_property.TargetFrameworkIdentifier = .NETCoreApp
build_property.TargetFrameworkVersion = v8.0
build_property.TargetPlatformMinVersion = 7.0
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = AxCopilot.SDK
build_property.ProjectDir = E:\AX Copilot\src\AxCopilot.SDK\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.CsWinRTUseWindowsUIXamlProjections = false
build_property.EffectiveAnalysisLevelStyle = 8.0
build_property.EnableCodeStyleSeverity =

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using System;
global using System.Collections.Generic;
global using System.IO;
global using System.Linq;
global using System.Net.Http;
global using System.Threading;
global using System.Threading.Tasks;

View File

@@ -0,0 +1 @@
f858a9c01dc195df406d6ab52031704c14e8ab236b899706a36768fde27b8d52

View File

@@ -0,0 +1,22 @@
E:\AX Commander\src\AxCopilot.SDK\bin\Debug\net8.0-windows\AxCopilot.SDK.deps.json
E:\AX Commander\src\AxCopilot.SDK\bin\Debug\net8.0-windows\AxCopilot.SDK.dll
E:\AX Commander\src\AxCopilot.SDK\bin\Debug\net8.0-windows\AxCopilot.SDK.pdb
E:\AX Commander\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.GeneratedMSBuildEditorConfig.editorconfig
E:\AX Commander\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.AssemblyInfoInputs.cache
E:\AX Commander\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.AssemblyInfo.cs
E:\AX Commander\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.csproj.CoreCompileInputs.cache
E:\AX Commander\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.dll
E:\AX Commander\src\AxCopilot.SDK\obj\Debug\net8.0-windows\refint\AxCopilot.SDK.dll
E:\AX Commander\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.pdb
E:\AX Commander\src\AxCopilot.SDK\obj\Debug\net8.0-windows\ref\AxCopilot.SDK.dll
E:\AX Copilot\src\AxCopilot.SDK\bin\Debug\net8.0-windows\AxCopilot.SDK.deps.json
E:\AX Copilot\src\AxCopilot.SDK\bin\Debug\net8.0-windows\AxCopilot.SDK.dll
E:\AX Copilot\src\AxCopilot.SDK\bin\Debug\net8.0-windows\AxCopilot.SDK.pdb
E:\AX Copilot\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.GeneratedMSBuildEditorConfig.editorconfig
E:\AX Copilot\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.AssemblyInfoInputs.cache
E:\AX Copilot\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.AssemblyInfo.cs
E:\AX Copilot\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.csproj.CoreCompileInputs.cache
E:\AX Copilot\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.dll
E:\AX Copilot\src\AxCopilot.SDK\obj\Debug\net8.0-windows\refint\AxCopilot.SDK.dll
E:\AX Copilot\src\AxCopilot.SDK\obj\Debug\net8.0-windows\AxCopilot.SDK.pdb
E:\AX Copilot\src\AxCopilot.SDK\obj\Debug\net8.0-windows\ref\AxCopilot.SDK.dll

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -0,0 +1,25 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("AX Copilot")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyDescriptionAttribute("SDK for building AX Copilot plugins")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("AxCopilot.SDK")]
[assembly: System.Reflection.AssemblyTitleAttribute("AxCopilot.SDK")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")]
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]
// MSBuild WriteCodeFragment 클래스에서 생성되었습니다.

View File

@@ -0,0 +1 @@
738bc7e0540ae4f36b5e492d4e3d178e3d47b839fe0e7005990856e92eba327e

View File

@@ -0,0 +1,18 @@
is_global = true
build_property.TargetFramework = net8.0-windows
build_property.TargetFrameworkIdentifier = .NETCoreApp
build_property.TargetFrameworkVersion = v8.0
build_property.TargetPlatformMinVersion = 7.0
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = AxCopilot.SDK
build_property.ProjectDir = E:\AX Copilot\src\AxCopilot.SDK\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.CsWinRTUseWindowsUIXamlProjections = false
build_property.EffectiveAnalysisLevelStyle = 8.0
build_property.EnableCodeStyleSeverity =

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using System;
global using System.Collections.Generic;
global using System.IO;
global using System.Linq;
global using System.Net.Http;
global using System.Threading;
global using System.Threading.Tasks;

View File

@@ -0,0 +1 @@
27f07c411e7cf633b2b3fae7a3b844fbef6553c99925e60eb5463ef14cc382c0

View File

@@ -0,0 +1,11 @@
E:\AX Copilot\src\AxCopilot.SDK\bin\Release\net8.0-windows\AxCopilot.SDK.deps.json
E:\AX Copilot\src\AxCopilot.SDK\bin\Release\net8.0-windows\AxCopilot.SDK.dll
E:\AX Copilot\src\AxCopilot.SDK\bin\Release\net8.0-windows\AxCopilot.SDK.pdb
E:\AX Copilot\src\AxCopilot.SDK\obj\Release\net8.0-windows\AxCopilot.SDK.GeneratedMSBuildEditorConfig.editorconfig
E:\AX Copilot\src\AxCopilot.SDK\obj\Release\net8.0-windows\AxCopilot.SDK.AssemblyInfoInputs.cache
E:\AX Copilot\src\AxCopilot.SDK\obj\Release\net8.0-windows\AxCopilot.SDK.AssemblyInfo.cs
E:\AX Copilot\src\AxCopilot.SDK\obj\Release\net8.0-windows\AxCopilot.SDK.csproj.CoreCompileInputs.cache
E:\AX Copilot\src\AxCopilot.SDK\obj\Release\net8.0-windows\AxCopilot.SDK.dll
E:\AX Copilot\src\AxCopilot.SDK\obj\Release\net8.0-windows\refint\AxCopilot.SDK.dll
E:\AX Copilot\src\AxCopilot.SDK\obj\Release\net8.0-windows\AxCopilot.SDK.pdb
E:\AX Copilot\src\AxCopilot.SDK\obj\Release\net8.0-windows\ref\AxCopilot.SDK.dll

View File

@@ -0,0 +1,74 @@
{
"version": 3,
"targets": {
"net8.0-windows7.0": {}
},
"libraries": {},
"projectFileDependencyGroups": {
"net8.0-windows7.0": []
},
"packageFolders": {
"C:\\Users\\admin\\.nuget\\packages\\": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj",
"projectName": "AxCopilot.SDK",
"projectPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj",
"packagesPath": "C:\\Users\\admin\\.nuget\\packages\\",
"outputPath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\admin\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"net8.0-windows"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0-windows7.0": {
"targetAlias": "net8.0-windows",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "10.0.200"
},
"frameworks": {
"net8.0-windows7.0": {
"targetAlias": "net8.0-windows",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View File

@@ -0,0 +1,8 @@
{
"version": 2,
"dgSpecHash": "jO+L+MmEpsc=",
"success": true,
"projectFilePath": "E:\\AX Copilot\\src\\AxCopilot.SDK\\AxCopilot.SDK.csproj",
"expectedPackageFiles": [],
"logs": []
}

View File

@@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<IsPackable>false</IsPackable>
<RootNamespace>AxCopilot.Tests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="xunit" Version="2.9.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.0" />
<PackageReference Include="FluentAssertions" Version="6.12.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AxCopilot\AxCopilot.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,279 @@
using FluentAssertions;
using AxCopilot.Core;
using Xunit;
namespace AxCopilot.Tests.Core;
public class FuzzyEngineTests
{
// ─── CalculateScore 기본 매칭 ────────────────────────────────────────────
[Fact]
public void CalculateScore_ExactMatch_ReturnsHighestScore()
{
var score = FuzzyEngine.CalculateScore("notepad", "notepad", 0);
score.Should().BeGreaterThanOrEqualTo(1000);
}
[Fact]
public void CalculateScore_PrefixMatch_ReturnsHighScore()
{
var score = FuzzyEngine.CalculateScore("note", "notepad", 0);
score.Should().BeGreaterThanOrEqualTo(800);
score.Should().BeLessThan(1000);
}
[Fact]
public void CalculateScore_ContainsMatch_ReturnsMediumScore()
{
var score = FuzzyEngine.CalculateScore("pad", "notepad", 0);
score.Should().BeGreaterThanOrEqualTo(600);
score.Should().BeLessThan(800);
}
[Fact]
public void CalculateScore_NoMatch_ReturnsZero()
{
var score = FuzzyEngine.CalculateScore("xyz", "notepad", 0);
score.Should().Be(0);
}
[Fact]
public void CalculateScore_EmptyQuery_ReturnsZero()
{
var score = FuzzyEngine.CalculateScore("", "notepad", 0);
score.Should().Be(0);
}
[Fact]
public void CalculateScore_BaseScore_AddsToResult()
{
var scoreWithBase = FuzzyEngine.CalculateScore("notepad", "notepad", 100);
var scoreWithout = FuzzyEngine.CalculateScore("notepad", "notepad", 0);
scoreWithBase.Should().Be(scoreWithout + 100);
}
[Fact]
public void CalculateScore_ExactBeforePrefix()
{
var exact = FuzzyEngine.CalculateScore("note", "note", 0);
var prefix = FuzzyEngine.CalculateScore("not", "note", 0);
exact.Should().BeGreaterThan(prefix);
}
// ─── FuzzyMatch ──────────────────────────────────────────────────────────
[Fact]
public void FuzzyMatch_AllCharsPresent_ReturnsPositive()
{
var score = FuzzyEngine.FuzzyMatch("ntpd", "notepad");
score.Should().BePositive();
}
[Fact]
public void FuzzyMatch_CharsMissing_ReturnsZero()
{
var score = FuzzyEngine.FuzzyMatch("xyz", "notepad");
score.Should().Be(0);
}
[Fact]
public void FuzzyMatch_ConsecutiveCharsScoreHigher()
{
var consecutive = FuzzyEngine.FuzzyMatch("not", "notepad");
var scattered = FuzzyEngine.FuzzyMatch("ntp", "notepad");
consecutive.Should().BeGreaterThan(scattered);
}
[Fact]
public void FuzzyMatch_EmptyQuery_ReturnsPositive()
{
var score = FuzzyEngine.FuzzyMatch("", "notepad");
score.Should().BeGreaterThanOrEqualTo(0);
}
[Fact]
public void FuzzyMatch_FullMatch_ReturnsHighScore()
{
var full = FuzzyEngine.FuzzyMatch("abcde", "abcde");
var partial = FuzzyEngine.FuzzyMatch("ace", "abcde");
full.Should().BeGreaterThan(partial);
}
[Fact]
public void FuzzyMatch_MinimumScoreGuaranteed()
{
var score = FuzzyEngine.FuzzyMatch("ntpd", "notepad");
score.Should().BeGreaterThanOrEqualTo(50);
}
// ─── 한글 자모 분리 ─────────────────────────────────────────────────────
[Theory]
[InlineData("가", "ㄱㅏ")]
[InlineData("한", "ㅎㅏㄴ")]
[InlineData("글", "ㄱㅡㄹ")]
[InlineData("abc", "abc")]
[InlineData("가a나", "ㄱㅏaㄴㅏ")]
public void DecomposeToJamo_ReturnsCorrectJamo(string input, string expected)
{
FuzzyEngine.DecomposeToJamo(input).Should().Be(expected);
}
// ─── 자모 기반 포함 검색 ────────────────────────────────────────────────
[Fact]
public void JamoContainsScore_MiddleWord_ReturnsPositive()
{
// "모장" → "메모장" (자모 분리 후 연속 매칭)
var score = FuzzyEngine.JamoContainsScore("메모장", "모장");
score.Should().BePositive();
}
[Fact]
public void JamoContainsScore_NoMatch_ReturnsZero()
{
var score = FuzzyEngine.JamoContainsScore("메모장", "가나");
score.Should().Be(0);
}
[Fact]
public void JamoContainsScore_SubsequenceMatch_ReturnsPositive()
{
// "메장" → 메-모-장에서 비연속 자모 매칭
var score = FuzzyEngine.JamoContainsScore("메모장", "메장");
score.Should().BePositive();
}
[Fact]
public void JamoContainsScore_NonKorean_ReturnsZero()
{
var score = FuzzyEngine.JamoContainsScore("notepad", "pad");
score.Should().Be(0); // 영어는 Contains에서 이미 처리
}
// ─── 한글 초성 검색 ──────────────────────────────────────────────────────
[Theory]
[InlineData("ㄴ", true)]
[InlineData("ㄴㅌ", true)]
[InlineData("ㄱㄴㄷ", true)]
public void IsChosung_ValidChosung_ReturnsTrue(string text, bool expected)
{
FuzzyEngine.IsChosung(text).Should().Be(expected);
}
[Theory]
[InlineData("notepad", false)]
[InlineData("노트패드", false)]
[InlineData("a", false)]
[InlineData("ㄴa", false)]
public void IsChosung_NonChosung_ReturnsFalse(string text, bool expected)
{
FuzzyEngine.IsChosung(text).Should().Be(expected);
}
[Fact]
public void GetChosung_HangulChar_ReturnsCorrectChosung()
{
FuzzyEngine.GetChosung('나').Should().Be('ㄴ');
FuzzyEngine.GetChosung('가').Should().Be('ㄱ');
FuzzyEngine.GetChosung('하').Should().Be('ㅎ');
}
[Fact]
public void GetChosung_NonHangul_ReturnsNull()
{
FuzzyEngine.GetChosung('a').Should().Be('\0');
FuzzyEngine.GetChosung('1').Should().Be('\0');
}
[Fact]
public void ContainsChosung_ConsecutiveMatch_ReturnsTrue()
{
FuzzyEngine.ContainsChosung("노트패드", "ㄴㅌ").Should().BeTrue();
}
[Fact]
public void ContainsChosung_NonMatchingChosung_ReturnsFalse()
{
FuzzyEngine.ContainsChosung("노트패드", "ㅅ").Should().BeFalse();
}
[Fact]
public void ContainsChosung_PartialMatch_ReturnsTrue()
{
FuzzyEngine.ContainsChosung("계산기", "ㄱㅅ").Should().BeTrue();
}
[Fact]
public void ContainsChosung_QueryLongerThanTarget_ReturnsFalse()
{
FuzzyEngine.ContainsChosung("가", "ㄱㄴㄷㄹ").Should().BeFalse();
}
[Fact]
public void ContainsChosung_NonConsecutive_ReturnsTrue()
{
// "ㅁㅊ" → 메모장(ㅁㅁㅈ) — 안 맞음 (ㅊ가 없으므로)
FuzzyEngine.ContainsChosung("메모장", "ㅁㅊ").Should().BeFalse();
// "ㅁㅈ" → 메모장(ㅁㅁㅈ) — 비연속 매칭
FuzzyEngine.ContainsChosung("메모장", "ㅁㅈ").Should().BeTrue();
}
// ─── 초성 점수 매칭 ─────────────────────────────────────────────────────
[Fact]
public void ChosungMatchScore_PureChosung_Consecutive()
{
var score = FuzzyEngine.ChosungMatchScore("계산기", "ㄱㅅ");
score.Should().BeGreaterThanOrEqualTo(500);
}
[Fact]
public void ChosungMatchScore_PureChosung_Subsequence()
{
// "ㅁㅈ" → 메모장 (ㅁ...ㅈ 비연속)
var score = FuzzyEngine.ChosungMatchScore("메모장", "ㅁㅈ");
score.Should().BePositive();
}
[Fact]
public void ChosungMatchScore_MixedQuery()
{
// "ㅁ장" → 혼합: ㅁ은 초성, 장은 완성형
var score = FuzzyEngine.ChosungMatchScore("메모장", "ㅁ장");
score.Should().BePositive();
}
[Fact]
public void ChosungMatchScore_NoMatch_ReturnsZero()
{
var score = FuzzyEngine.ChosungMatchScore("메모장", "ㅋㅋ");
score.Should().Be(0);
}
// ─── 통합 점수 우선순위 ─────────────────────────────────────────────────
[Fact]
public void CalculateScore_ScoreHierarchy()
{
// 정확 > 시작 > 포함 > 자모포함 > 초성 > fuzzy
var exact = FuzzyEngine.CalculateScore("메모장", "메모장", 0);
var prefix = FuzzyEngine.CalculateScore("메모", "메모장", 0);
var contains = FuzzyEngine.CalculateScore("모장", "메모장", 0);
exact.Should().BeGreaterThan(prefix);
prefix.Should().BeGreaterThan(contains);
}
[Fact]
public void CalculateScore_JamoBeforeChosung()
{
// "모장" (자모 포함) > "ㅁㅈ" (초성 비연속)
var jamo = FuzzyEngine.CalculateScore("모장", "메모장", 0);
var chosung = FuzzyEngine.CalculateScore("ㅁㅈ", "메모장", 0);
jamo.Should().BeGreaterThan(chosung);
}
}

View File

@@ -0,0 +1,215 @@
using System.Text;
using FluentAssertions;
using AxCopilot.Handlers;
using Xunit;
namespace AxCopilot.Tests.Handlers;
public class ClipboardTransformTests
{
// ─── 대소문자 변환 ────────────────────────────────────────────────────────
[Fact]
public void Upper_ConvertsToUppercase()
{
ClipboardHandler.ExecuteBuiltin("$upper", "hello world").Should().Be("HELLO WORLD");
}
[Fact]
public void Lower_ConvertsToLowercase()
{
ClipboardHandler.ExecuteBuiltin("$lower", "HELLO WORLD").Should().Be("hello world");
}
// ─── Base64 ──────────────────────────────────────────────────────────────
[Fact]
public void Base64Encode_EncodesCorrectly()
{
ClipboardHandler.ExecuteBuiltin("$b64e", "hello").Should().Be("aGVsbG8=");
}
[Fact]
public void Base64Decode_DecodesCorrectly()
{
ClipboardHandler.ExecuteBuiltin("$b64d", "aGVsbG8=").Should().Be("hello");
}
[Fact]
public void Base64_RoundTrip()
{
var original = "AX Copilot 테스트";
var encoded = ClipboardHandler.ExecuteBuiltin("$b64e", original)!;
var decoded = ClipboardHandler.ExecuteBuiltin("$b64d", encoded);
decoded.Should().Be(original);
}
// ─── URL 인코딩 ──────────────────────────────────────────────────────────
[Fact]
public void UrlEncode_EncodesSpaces()
{
ClipboardHandler.ExecuteBuiltin("$urle", "hello world").Should().Be("hello%20world");
}
[Fact]
public void UrlDecode_DecodesSpaces()
{
ClipboardHandler.ExecuteBuiltin("$urld", "hello%20world").Should().Be("hello world");
}
[Fact]
public void UrlEncode_EncodesSpecialChars()
{
var result = ClipboardHandler.ExecuteBuiltin("$urle", "a=b&c=d");
result.Should().Be("a%3Db%26c%3Dd");
}
[Fact]
public void UrlDecode_DecodesSpecialChars()
{
var result = ClipboardHandler.ExecuteBuiltin("$urld", "a%3Db%26c%3Dd");
result.Should().Be("a=b&c=d");
}
// ─── 문자열 처리 ─────────────────────────────────────────────────────────
[Fact]
public void Trim_RemovesLeadingTrailingWhitespace()
{
ClipboardHandler.ExecuteBuiltin("$trim", " hello ").Should().Be("hello");
}
[Fact]
public void Trim_PreservesInternalSpaces()
{
ClipboardHandler.ExecuteBuiltin("$trim", " hello world ").Should().Be("hello world");
}
[Fact]
public void Lines_RemovesEmptyLines()
{
var input = "a\n\nb\n \nc";
var result = ClipboardHandler.ExecuteBuiltin("$lines", input);
result.Should().NotContain("\n\n");
result.Should().Contain("a");
result.Should().Contain("b");
result.Should().Contain("c");
}
[Fact]
public void Lines_TrimsEachLine()
{
var input = " hello \n world ";
var result = ClipboardHandler.ExecuteBuiltin("$lines", input)!;
result.Should().Contain("hello");
result.Should().Contain("world");
result.Should().NotContain(" hello");
}
// ─── 타임스탬프 ──────────────────────────────────────────────────────────
[Fact]
public void Timestamp_EpochZero_Returns1970()
{
var result = ClipboardHandler.ExecuteBuiltin("$ts", "0");
result.Should().NotBeNullOrEmpty();
result.Should().Contain("1970");
}
[Fact]
public void Timestamp_ValidEpoch_ReturnsDateString()
{
var result = ClipboardHandler.ExecuteBuiltin("$ts", "1700000000");
result.Should().NotBeNullOrEmpty();
result.Should().MatchRegex(@"\d{4}-\d{2}-\d{2}");
}
[Fact]
public void Timestamp_InvalidInput_ReturnsNull()
{
ClipboardHandler.ExecuteBuiltin("$ts", "not-a-number").Should().BeNull();
}
[Fact]
public void Epoch_ValidDate_ReturnsNumber()
{
var result = ClipboardHandler.ExecuteBuiltin("$epoch", "1970-01-01");
result.Should().NotBeNullOrEmpty();
long.TryParse(result, out _).Should().BeTrue();
}
[Fact]
public void Epoch_InvalidDate_ReturnsNull()
{
ClipboardHandler.ExecuteBuiltin("$epoch", "not-a-date").Should().BeNull();
}
// ─── JSON 포맷팅 ─────────────────────────────────────────────────────────
[Fact]
public void JsonFormat_MinifiedJson_AddsIndentation()
{
var result = ClipboardHandler.ExecuteBuiltin("$json", "{\"a\":1,\"b\":2}");
result.Should().NotBeNullOrEmpty();
result.Should().Contain("\n");
result.Should().Contain("\"a\"");
}
[Fact]
public void JsonFormat_AlreadyFormatted_StaysValid()
{
var formatted = "{\n \"a\": 1\n}";
var result = ClipboardHandler.ExecuteBuiltin("$json", formatted);
result.Should().NotBeNullOrEmpty();
result.Should().Contain("\"a\"");
}
[Fact]
public void JsonFormat_InvalidJson_ReturnsOriginal()
{
var invalid = "not json";
var result = ClipboardHandler.ExecuteBuiltin("$json", invalid);
result.Should().Be(invalid); // 파싱 실패 시 원본 반환
}
// ─── 마크다운 제거 ───────────────────────────────────────────────────────
[Fact]
public void StripMarkdown_RemovesBold()
{
var result = ClipboardHandler.ExecuteBuiltin("$md", "**bold text**");
result.Should().NotContain("**");
result.Should().Contain("bold text");
}
[Fact]
public void StripMarkdown_RemovesItalic()
{
var result = ClipboardHandler.ExecuteBuiltin("$md", "*italic*");
result.Should().NotContain("*italic*");
result.Should().Contain("italic");
}
[Fact]
public void StripMarkdown_RemovesInlineCode()
{
var result = ClipboardHandler.ExecuteBuiltin("$md", "`code`");
result.Should().NotContain("`");
result.Should().Contain("code");
}
// ─── 알 수 없는 키 ──────────────────────────────────────────────────────
[Fact]
public void UnknownKey_ReturnsNull()
{
ClipboardHandler.ExecuteBuiltin("$unknown", "input").Should().BeNull();
}
[Fact]
public void EmptyKey_ReturnsNull()
{
ClipboardHandler.ExecuteBuiltin("", "input").Should().BeNull();
}
}

View File

@@ -0,0 +1,208 @@
using System.Text.Json;
using FluentAssertions;
using AxCopilot.Models;
using Xunit;
namespace AxCopilot.Tests.Services;
public class SettingsServiceTests
{
// ─── AppSettings 기본값 ──────────────────────────────────────────────────
[Fact]
public void AppSettings_DefaultHotkey_IsAltSpace()
{
new AppSettings().Hotkey.Should().Be("Alt+Space");
}
[Fact]
public void LauncherSettings_DefaultMaxResults_IsSeven()
{
new LauncherSettings().MaxResults.Should().Be(7);
}
[Fact]
public void LauncherSettings_DefaultTheme_IsSystem()
{
new LauncherSettings().Theme.Should().Be("system");
}
[Fact]
public void LauncherSettings_DefaultOpacity_IsValid()
{
var opacity = new LauncherSettings().Opacity;
opacity.Should().BeInRange(0.0, 1.0);
}
[Fact]
public void AppSettings_DefaultMonitorMismatch_IsWarn()
{
new AppSettings().MonitorMismatch.Should().Be("warn");
}
[Fact]
public void AppSettings_DefaultIndexPaths_NotEmpty()
{
new AppSettings().IndexPaths.Should().NotBeEmpty();
}
// ─── LauncherSettings 테마 ───────────────────────────────────────────────
[Theory]
[InlineData("system")]
[InlineData("dark")]
[InlineData("light")]
public void LauncherSettings_Theme_AcceptsValidValues(string theme)
{
var settings = new LauncherSettings { Theme = theme };
settings.Theme.Should().Be(theme);
}
// ─── JSON 직렬화 라운드트립 ──────────────────────────────────────────────
[Fact]
public void AppSettings_Serialization_PreservesHotkey()
{
var original = new AppSettings { Hotkey = "Ctrl+Space" };
var restored = RoundTrip(original);
restored.Hotkey.Should().Be("Ctrl+Space");
}
[Fact]
public void AppSettings_Serialization_PreservesTheme()
{
var original = new AppSettings
{
Launcher = new LauncherSettings { Theme = "dark" }
};
var restored = RoundTrip(original);
restored.Launcher.Theme.Should().Be("dark");
}
[Fact]
public void AppSettings_Serialization_PreservesMaxResults()
{
var original = new AppSettings
{
Launcher = new LauncherSettings { MaxResults = 15 }
};
var restored = RoundTrip(original);
restored.Launcher.MaxResults.Should().Be(15);
}
[Fact]
public void AppSettings_Serialization_PreservesAliases()
{
var original = new AppSettings
{
Aliases =
[
new() { Key = "@test", Type = "url", Target = "https://example.com" }
]
};
var restored = RoundTrip(original);
restored.Aliases.Should().HaveCount(1);
restored.Aliases[0].Key.Should().Be("@test");
restored.Aliases[0].Target.Should().Be("https://example.com");
}
// ─── AliasEntry ──────────────────────────────────────────────────────────
[Fact]
public void AliasEntry_DefaultShowWindow_IsFalse()
{
new AliasEntry().ShowWindow.Should().BeFalse();
}
[Theory]
[InlineData("url")]
[InlineData("folder")]
[InlineData("app")]
[InlineData("batch")]
[InlineData("api")]
[InlineData("clipboard")]
public void AliasEntry_Type_AcceptsAllTypes(string type)
{
var entry = new AliasEntry { Type = type };
entry.Type.Should().Be(type);
}
// ─── WorkspaceProfile / WindowSnapshot ───────────────────────────────────
[Fact]
public void WorkspaceProfile_DefaultWindows_IsEmpty()
{
new WorkspaceProfile().Windows.Should().BeEmpty();
}
[Fact]
public void WindowSnapshot_DefaultShowCmd_IsNormal()
{
new WindowSnapshot().ShowCmd.Should().Be("Normal");
}
[Fact]
public void WindowSnapshot_DefaultMonitor_IsZero()
{
new WindowSnapshot().Monitor.Should().Be(0);
}
[Fact]
public void WindowRect_DefaultValues_AreZero()
{
var rect = new WindowRect();
rect.X.Should().Be(0);
rect.Y.Should().Be(0);
rect.Width.Should().Be(0);
rect.Height.Should().Be(0);
}
[Fact]
public void WorkspaceProfile_Serialization_RoundTrip()
{
var profile = new WorkspaceProfile
{
Name = "작업 프로필",
Windows =
[
new() { Exe = "notepad.exe", ShowCmd = "Maximized", Monitor = 1 }
]
};
var json = JsonSerializer.Serialize(profile, JsonOptions);
var restored = JsonSerializer.Deserialize<WorkspaceProfile>(json, JsonOptions)!;
restored.Name.Should().Be("작업 프로필");
restored.Windows.Should().HaveCount(1);
restored.Windows[0].Exe.Should().Be("notepad.exe");
restored.Windows[0].ShowCmd.Should().Be("Maximized");
restored.Windows[0].Monitor.Should().Be(1);
}
// ─── ClipboardTransformer ────────────────────────────────────────────────
[Fact]
public void ClipboardTransformer_DefaultTimeout_IsFiveSeconds()
{
new ClipboardTransformer().Timeout.Should().Be(5000);
}
[Fact]
public void ClipboardTransformer_DefaultType_IsRegex()
{
new ClipboardTransformer().Type.Should().Be("regex");
}
// ─── Helpers ─────────────────────────────────────────────────────────────
private static readonly JsonSerializerOptions JsonOptions = new()
{
WriteIndented = false,
PropertyNameCaseInsensitive = true
};
private static AppSettings RoundTrip(AppSettings original)
{
var json = JsonSerializer.Serialize(original, JsonOptions);
return JsonSerializer.Deserialize<AppSettings>(json, JsonOptions)!;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -0,0 +1,941 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"AxCopilot.Tests/1.0.0": {
"dependencies": {
"AxCopilot": "1.7.2",
"FluentAssertions": "6.12.0",
"Microsoft.NET.Test.Sdk": "17.11.0",
"xunit": "2.9.0",
"Microsoft.Web.WebView2.Core": "1.0.2903.40",
"Microsoft.Web.WebView2.WinForms": "1.0.2903.40",
"Microsoft.Web.WebView2.Wpf": "1.0.2903.40"
},
"runtime": {
"AxCopilot.Tests.dll": {}
}
},
"DocumentFormat.OpenXml/3.2.0": {
"dependencies": {
"DocumentFormat.OpenXml.Framework": "3.2.0"
},
"runtime": {
"lib/net8.0/DocumentFormat.OpenXml.dll": {
"assemblyVersion": "3.2.0.0",
"fileVersion": "3.2.0.0"
}
}
},
"DocumentFormat.OpenXml.Framework/3.2.0": {
"dependencies": {
"System.IO.Packaging": "8.0.1"
},
"runtime": {
"lib/net8.0/DocumentFormat.OpenXml.Framework.dll": {
"assemblyVersion": "3.2.0.0",
"fileVersion": "3.2.0.0"
}
}
},
"FluentAssertions/6.12.0": {
"runtime": {
"lib/net6.0/FluentAssertions.dll": {
"assemblyVersion": "6.12.0.0",
"fileVersion": "6.12.0.0"
}
}
},
"Markdig/0.37.0": {
"runtime": {
"lib/net8.0/Markdig.dll": {
"assemblyVersion": "0.37.0.0",
"fileVersion": "0.37.0.0"
}
}
},
"Microsoft.CodeCoverage/17.11.0": {
"runtime": {
"lib/netcoreapp3.1/Microsoft.VisualStudio.CodeCoverage.Shim.dll": {
"assemblyVersion": "15.0.0.0",
"fileVersion": "17.1100.424.36701"
}
}
},
"Microsoft.Data.Sqlite/8.0.0": {
"dependencies": {
"Microsoft.Data.Sqlite.Core": "8.0.0",
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.6"
}
},
"Microsoft.Data.Sqlite.Core/8.0.0": {
"dependencies": {
"SQLitePCLRaw.core": "2.1.6"
},
"runtime": {
"lib/net8.0/Microsoft.Data.Sqlite.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.23.53103"
}
}
},
"Microsoft.NET.Test.Sdk/17.11.0": {
"dependencies": {
"Microsoft.CodeCoverage": "17.11.0",
"Microsoft.TestPlatform.TestHost": "17.11.0"
}
},
"Microsoft.TestPlatform.ObjectModel/17.11.0": {
"runtime": {
"lib/netcoreapp3.1/Microsoft.TestPlatform.CoreUtilities.dll": {
"assemblyVersion": "15.0.0.0",
"fileVersion": "17.1100.24.41901"
},
"lib/netcoreapp3.1/Microsoft.TestPlatform.PlatformAbstractions.dll": {
"assemblyVersion": "15.0.0.0",
"fileVersion": "17.1100.24.41901"
},
"lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.ObjectModel.dll": {
"assemblyVersion": "15.0.0.0",
"fileVersion": "17.1100.24.41901"
}
},
"resources": {
"lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "cs"
},
"lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "cs"
},
"lib/netcoreapp3.1/de/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "de"
},
"lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "de"
},
"lib/netcoreapp3.1/es/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "es"
},
"lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "es"
},
"lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "fr"
},
"lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "fr"
},
"lib/netcoreapp3.1/it/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "it"
},
"lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "it"
},
"lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "ja"
},
"lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "ja"
},
"lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "ko"
},
"lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "ko"
},
"lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "pl"
},
"lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "pl"
},
"lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "pt-BR"
},
"lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "pt-BR"
},
"lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "ru"
},
"lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "ru"
},
"lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "tr"
},
"lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "tr"
},
"lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "zh-Hans"
},
"lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "zh-Hans"
},
"lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CoreUtilities.resources.dll": {
"locale": "zh-Hant"
},
"lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.ObjectModel.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.TestPlatform.TestHost/17.11.0": {
"dependencies": {
"Microsoft.TestPlatform.ObjectModel": "17.11.0",
"Newtonsoft.Json": "13.0.1"
},
"runtime": {
"lib/netcoreapp3.1/Microsoft.TestPlatform.CommunicationUtilities.dll": {
"assemblyVersion": "15.0.0.0",
"fileVersion": "17.1100.24.41901"
},
"lib/netcoreapp3.1/Microsoft.TestPlatform.CrossPlatEngine.dll": {
"assemblyVersion": "15.0.0.0",
"fileVersion": "17.1100.24.41901"
},
"lib/netcoreapp3.1/Microsoft.TestPlatform.Utilities.dll": {
"assemblyVersion": "15.0.0.0",
"fileVersion": "17.1100.24.41901"
},
"lib/netcoreapp3.1/Microsoft.VisualStudio.TestPlatform.Common.dll": {
"assemblyVersion": "15.0.0.0",
"fileVersion": "17.1100.24.41901"
},
"lib/netcoreapp3.1/testhost.dll": {
"assemblyVersion": "15.0.0.0",
"fileVersion": "17.1100.24.41901"
}
},
"resources": {
"lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "cs"
},
"lib/netcoreapp3.1/cs/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "cs"
},
"lib/netcoreapp3.1/cs/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "cs"
},
"lib/netcoreapp3.1/de/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "de"
},
"lib/netcoreapp3.1/de/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "de"
},
"lib/netcoreapp3.1/de/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "de"
},
"lib/netcoreapp3.1/es/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "es"
},
"lib/netcoreapp3.1/es/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "es"
},
"lib/netcoreapp3.1/es/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "es"
},
"lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "fr"
},
"lib/netcoreapp3.1/fr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "fr"
},
"lib/netcoreapp3.1/fr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "fr"
},
"lib/netcoreapp3.1/it/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "it"
},
"lib/netcoreapp3.1/it/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "it"
},
"lib/netcoreapp3.1/it/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "it"
},
"lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "ja"
},
"lib/netcoreapp3.1/ja/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "ja"
},
"lib/netcoreapp3.1/ja/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "ja"
},
"lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "ko"
},
"lib/netcoreapp3.1/ko/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "ko"
},
"lib/netcoreapp3.1/ko/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "ko"
},
"lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "pl"
},
"lib/netcoreapp3.1/pl/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "pl"
},
"lib/netcoreapp3.1/pl/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "pl"
},
"lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "pt-BR"
},
"lib/netcoreapp3.1/pt-BR/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "pt-BR"
},
"lib/netcoreapp3.1/pt-BR/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "pt-BR"
},
"lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "ru"
},
"lib/netcoreapp3.1/ru/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "ru"
},
"lib/netcoreapp3.1/ru/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "ru"
},
"lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "tr"
},
"lib/netcoreapp3.1/tr/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "tr"
},
"lib/netcoreapp3.1/tr/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "tr"
},
"lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "zh-Hans"
},
"lib/netcoreapp3.1/zh-Hans/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "zh-Hans"
},
"lib/netcoreapp3.1/zh-Hans/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "zh-Hans"
},
"lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CommunicationUtilities.resources.dll": {
"locale": "zh-Hant"
},
"lib/netcoreapp3.1/zh-Hant/Microsoft.TestPlatform.CrossPlatEngine.resources.dll": {
"locale": "zh-Hant"
},
"lib/netcoreapp3.1/zh-Hant/Microsoft.VisualStudio.TestPlatform.Common.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.Web.WebView2/1.0.2903.40": {
"runtimeTargets": {
"runtimes/win-arm64/native/WebView2Loader.dll": {
"rid": "win-arm64",
"assetType": "native",
"fileVersion": "1.0.2903.40"
},
"runtimes/win-x64/native/WebView2Loader.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "1.0.2903.40"
},
"runtimes/win-x86/native/WebView2Loader.dll": {
"rid": "win-x86",
"assetType": "native",
"fileVersion": "1.0.2903.40"
}
}
},
"Newtonsoft.Json/13.0.1": {
"runtime": {
"lib/netstandard2.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.1.25517"
}
}
},
"SQLitePCLRaw.bundle_e_sqlite3/2.1.6": {
"dependencies": {
"SQLitePCLRaw.lib.e_sqlite3": "2.1.6",
"SQLitePCLRaw.provider.e_sqlite3": "2.1.6"
},
"runtime": {
"lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll": {
"assemblyVersion": "2.1.6.2060",
"fileVersion": "2.1.6.2060"
}
}
},
"SQLitePCLRaw.core/2.1.6": {
"runtime": {
"lib/netstandard2.0/SQLitePCLRaw.core.dll": {
"assemblyVersion": "2.1.6.2060",
"fileVersion": "2.1.6.2060"
}
}
},
"SQLitePCLRaw.lib.e_sqlite3/2.1.6": {
"runtimeTargets": {
"runtimes/browser-wasm/nativeassets/net8.0/e_sqlite3.a": {
"rid": "browser-wasm",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-arm/native/libe_sqlite3.so": {
"rid": "linux-arm",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-arm64/native/libe_sqlite3.so": {
"rid": "linux-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-armel/native/libe_sqlite3.so": {
"rid": "linux-armel",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-mips64/native/libe_sqlite3.so": {
"rid": "linux-mips64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-musl-arm/native/libe_sqlite3.so": {
"rid": "linux-musl-arm",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-musl-arm64/native/libe_sqlite3.so": {
"rid": "linux-musl-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-musl-x64/native/libe_sqlite3.so": {
"rid": "linux-musl-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-ppc64le/native/libe_sqlite3.so": {
"rid": "linux-ppc64le",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-s390x/native/libe_sqlite3.so": {
"rid": "linux-s390x",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-x64/native/libe_sqlite3.so": {
"rid": "linux-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-x86/native/libe_sqlite3.so": {
"rid": "linux-x86",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/maccatalyst-arm64/native/libe_sqlite3.dylib": {
"rid": "maccatalyst-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/maccatalyst-x64/native/libe_sqlite3.dylib": {
"rid": "maccatalyst-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/osx-arm64/native/libe_sqlite3.dylib": {
"rid": "osx-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/osx-x64/native/libe_sqlite3.dylib": {
"rid": "osx-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-arm/native/e_sqlite3.dll": {
"rid": "win-arm",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-arm64/native/e_sqlite3.dll": {
"rid": "win-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-x64/native/e_sqlite3.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-x86/native/e_sqlite3.dll": {
"rid": "win-x86",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"SQLitePCLRaw.provider.e_sqlite3/2.1.6": {
"dependencies": {
"SQLitePCLRaw.core": "2.1.6"
},
"runtime": {
"lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {
"assemblyVersion": "2.1.6.2060",
"fileVersion": "2.1.6.2060"
}
}
},
"System.Diagnostics.EventLog/8.0.1": {
"runtime": {
"lib/net8.0/System.Diagnostics.EventLog.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
},
"runtimeTargets": {
"runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"System.IO.Packaging/8.0.1": {
"runtime": {
"lib/net8.0/System.IO.Packaging.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"System.ServiceProcess.ServiceController/8.0.1": {
"dependencies": {
"System.Diagnostics.EventLog": "8.0.1"
},
"runtime": {
"lib/net8.0/System.ServiceProcess.ServiceController.dll": {
"assemblyVersion": "8.0.0.1",
"fileVersion": "8.0.1024.46610"
}
},
"runtimeTargets": {
"runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "8.0.0.1",
"fileVersion": "8.0.1024.46610"
}
}
},
"UglyToad.PdfPig/1.7.0-custom-5": {
"dependencies": {
"UglyToad.PdfPig.Core": "1.7.0-custom-5",
"UglyToad.PdfPig.Fonts": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokenization": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokens": "1.7.0-custom-5"
},
"runtime": {
"lib/net6.0/UglyToad.PdfPig.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"UglyToad.PdfPig.Core/1.7.0-custom-5": {
"runtime": {
"lib/net6.0/UglyToad.PdfPig.Core.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"UglyToad.PdfPig.Fonts/1.7.0-custom-5": {
"dependencies": {
"UglyToad.PdfPig.Core": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokenization": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokens": "1.7.0-custom-5"
},
"runtime": {
"lib/net6.0/UglyToad.PdfPig.Fonts.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"UglyToad.PdfPig.Tokenization/1.7.0-custom-5": {
"dependencies": {
"UglyToad.PdfPig.Core": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokens": "1.7.0-custom-5"
},
"runtime": {
"lib/net6.0/UglyToad.PdfPig.Tokenization.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"UglyToad.PdfPig.Tokens/1.7.0-custom-5": {
"dependencies": {
"UglyToad.PdfPig.Core": "1.7.0-custom-5"
},
"runtime": {
"lib/net6.0/UglyToad.PdfPig.Tokens.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"xunit/2.9.0": {
"dependencies": {
"xunit.assert": "2.9.0",
"xunit.core": "2.9.0"
}
},
"xunit.abstractions/2.0.3": {
"runtime": {
"lib/netstandard2.0/xunit.abstractions.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.0.0.0"
}
}
},
"xunit.assert/2.9.0": {
"runtime": {
"lib/net6.0/xunit.assert.dll": {
"assemblyVersion": "2.9.0.0",
"fileVersion": "2.9.0.0"
}
}
},
"xunit.core/2.9.0": {
"dependencies": {
"xunit.extensibility.core": "2.9.0",
"xunit.extensibility.execution": "2.9.0"
}
},
"xunit.extensibility.core/2.9.0": {
"dependencies": {
"xunit.abstractions": "2.0.3"
},
"runtime": {
"lib/netstandard1.1/xunit.core.dll": {
"assemblyVersion": "2.9.0.0",
"fileVersion": "2.9.0.0"
}
}
},
"xunit.extensibility.execution/2.9.0": {
"dependencies": {
"xunit.extensibility.core": "2.9.0"
},
"runtime": {
"lib/netstandard1.1/xunit.execution.dotnet.dll": {
"assemblyVersion": "2.9.0.0",
"fileVersion": "2.9.0.0"
}
}
},
"AxCopilot/1.7.2": {
"dependencies": {
"AxCopilot.SDK": "1.0.0",
"DocumentFormat.OpenXml": "3.2.0",
"Markdig": "0.37.0",
"Microsoft.Data.Sqlite": "8.0.0",
"Microsoft.Web.WebView2": "1.0.2903.40",
"System.ServiceProcess.ServiceController": "8.0.1",
"UglyToad.PdfPig": "1.7.0-custom-5"
},
"runtime": {
"AxCopilot.dll": {
"assemblyVersion": "1.7.2.0",
"fileVersion": "1.7.2.0"
}
}
},
"AxCopilot.SDK/1.0.0": {
"runtime": {
"AxCopilot.SDK.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"Microsoft.Web.WebView2.Core/1.0.2903.40": {
"runtime": {
"Microsoft.Web.WebView2.Core.dll": {
"assemblyVersion": "1.0.2903.40",
"fileVersion": "1.0.2903.40"
}
}
},
"Microsoft.Web.WebView2.WinForms/1.0.2903.40": {
"runtime": {
"Microsoft.Web.WebView2.WinForms.dll": {
"assemblyVersion": "1.0.2903.40",
"fileVersion": "1.0.2903.40"
}
}
},
"Microsoft.Web.WebView2.Wpf/1.0.2903.40": {
"runtime": {
"Microsoft.Web.WebView2.Wpf.dll": {
"assemblyVersion": "1.0.2903.40",
"fileVersion": "1.0.2903.40"
}
}
}
}
},
"libraries": {
"AxCopilot.Tests/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"DocumentFormat.OpenXml/3.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eDBT9G0sAWUvjgE8l8E5bGCFXgxCZXIecQ8dqUnj2PyxyMR5eBmLahqRRw3Q7uSKM3cKbysaL2mEY0JJbEEOEA==",
"path": "documentformat.openxml/3.2.0",
"hashPath": "documentformat.openxml.3.2.0.nupkg.sha512"
},
"DocumentFormat.OpenXml.Framework/3.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-e1neOKqRnSHUom4JQEorAoZ67aiJOp6+Xzsu0fc6IYfFcgQn6roo+w6i2w//N2u/5ilEfvLr35bNO9zaIN7r7g==",
"path": "documentformat.openxml.framework/3.2.0",
"hashPath": "documentformat.openxml.framework.3.2.0.nupkg.sha512"
},
"FluentAssertions/6.12.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==",
"path": "fluentassertions/6.12.0",
"hashPath": "fluentassertions.6.12.0.nupkg.sha512"
},
"Markdig/0.37.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-biiu4MTPFjW55qw6v5Aphtj0MjDLJ14x8ndZwkJUHIeqvaSGKeqhLY7S7Vu/S3k7/c9KwhhnaCDP9hdFNUhcNA==",
"path": "markdig/0.37.0",
"hashPath": "markdig.0.37.0.nupkg.sha512"
},
"Microsoft.CodeCoverage/17.11.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-QKcOSuw7MZG4XiQ+pCj+Ib6amOwoRDEO7e3DbxqXeOPXSnfyGXYoZQI8I140s1mKQVn1Vh+c5WlKvCvlgMovpg==",
"path": "microsoft.codecoverage/17.11.0",
"hashPath": "microsoft.codecoverage.17.11.0.nupkg.sha512"
},
"Microsoft.Data.Sqlite/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-H+iC5IvkCCKSNHXzL3JARvDn7VpkvuJM91KVB89sKjeTF/KX/BocNNh93ZJtX5MCQKb/z4yVKgkU2sVIq+xKfg==",
"path": "microsoft.data.sqlite/8.0.0",
"hashPath": "microsoft.data.sqlite.8.0.0.nupkg.sha512"
},
"Microsoft.Data.Sqlite.Core/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==",
"path": "microsoft.data.sqlite.core/8.0.0",
"hashPath": "microsoft.data.sqlite.core.8.0.0.nupkg.sha512"
},
"Microsoft.NET.Test.Sdk/17.11.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fH7P0LihMXgnlNLtrXGetHd30aQcD+YrSbWXbCPBnrypdRApPgNqd/TgncTlSVY1bbLYdnvpBgts2dcnK37GzA==",
"path": "microsoft.net.test.sdk/17.11.0",
"hashPath": "microsoft.net.test.sdk.17.11.0.nupkg.sha512"
},
"Microsoft.TestPlatform.ObjectModel/17.11.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PU+CC1yRzbR0IllrtdILaeep7WP5OIrvmWrvCMqG3jB1h4F6Ur7CYHl6ENbDVXPzEvygXh0GWbTyrbjfvgTpAg==",
"path": "microsoft.testplatform.objectmodel/17.11.0",
"hashPath": "microsoft.testplatform.objectmodel.17.11.0.nupkg.sha512"
},
"Microsoft.TestPlatform.TestHost/17.11.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KMzJO3dm3+9W8JRQ3IDviu0v7uXP5Lgii6TuxMc5m8ynaqcGnn7Y18cMb5AsP2xp59uUHO474WZrssxBdb8ZxQ==",
"path": "microsoft.testplatform.testhost/17.11.0",
"hashPath": "microsoft.testplatform.testhost.17.11.0.nupkg.sha512"
},
"Microsoft.Web.WebView2/1.0.2903.40": {
"type": "package",
"serviceable": true,
"sha512": "sha512-THrzYAnJgE3+cNH+9Epr44XjoZoRELdVpXlWGPs6K9C9G6TqyDfVCeVAR/Er8ljLitIUX5gaSkPsy9wRhD1sgQ==",
"path": "microsoft.web.webview2/1.0.2903.40",
"hashPath": "microsoft.web.webview2.1.0.2903.40.nupkg.sha512"
},
"Newtonsoft.Json/13.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
"path": "newtonsoft.json/13.0.1",
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
},
"SQLitePCLRaw.bundle_e_sqlite3/2.1.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==",
"path": "sqlitepclraw.bundle_e_sqlite3/2.1.6",
"hashPath": "sqlitepclraw.bundle_e_sqlite3.2.1.6.nupkg.sha512"
},
"SQLitePCLRaw.core/2.1.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==",
"path": "sqlitepclraw.core/2.1.6",
"hashPath": "sqlitepclraw.core.2.1.6.nupkg.sha512"
},
"SQLitePCLRaw.lib.e_sqlite3/2.1.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==",
"path": "sqlitepclraw.lib.e_sqlite3/2.1.6",
"hashPath": "sqlitepclraw.lib.e_sqlite3.2.1.6.nupkg.sha512"
},
"SQLitePCLRaw.provider.e_sqlite3/2.1.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==",
"path": "sqlitepclraw.provider.e_sqlite3/2.1.6",
"hashPath": "sqlitepclraw.provider.e_sqlite3.2.1.6.nupkg.sha512"
},
"System.Diagnostics.EventLog/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==",
"path": "system.diagnostics.eventlog/8.0.1",
"hashPath": "system.diagnostics.eventlog.8.0.1.nupkg.sha512"
},
"System.IO.Packaging/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KYkIOAvPexQOLDxPO2g0BVoWInnQhPpkFzRqvNrNrMhVT6kqhVr0zEb6KCHlptLFukxnZrjuMVAnxK7pOGUYrw==",
"path": "system.io.packaging/8.0.1",
"hashPath": "system.io.packaging.8.0.1.nupkg.sha512"
},
"System.ServiceProcess.ServiceController/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-02I0BXo1kmMBgw03E8Hu4K6nTqur4wpQdcDZrndczPzY2fEoGvlinE35AWbyzLZ2h2IksEZ6an4tVt3hi9j1oA==",
"path": "system.serviceprocess.servicecontroller/8.0.1",
"hashPath": "system.serviceprocess.servicecontroller.8.0.1.nupkg.sha512"
},
"UglyToad.PdfPig/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-mddnoBg+XV5YZJg+lp/LlXQ9NY9/oV/MoNjLbbLHw0uTymfyuinVePQB4ff/ELRv3s6n0G7h8q3Ycb3KYg+hgQ==",
"path": "uglytoad.pdfpig/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.1.7.0-custom-5.nupkg.sha512"
},
"UglyToad.PdfPig.Core/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bChQUAYApM6/vgBis0+fBTZyAVqjXdqshjZDCgI3dgwUplfLJxXRrnkCOdNj0a6JNcF32R4aLpnGpTc9QmmVmg==",
"path": "uglytoad.pdfpig.core/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.core.1.7.0-custom-5.nupkg.sha512"
},
"UglyToad.PdfPig.Fonts/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Z6SBBAIL8wRkJNhXGYaz0CrHnNrNeuNtmwRbBtQUA1b3TDhRQppOmHCIuhjb6Vu/Rirp6FIOtzAU1lXsGik90w==",
"path": "uglytoad.pdfpig.fonts/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.fonts.1.7.0-custom-5.nupkg.sha512"
},
"UglyToad.PdfPig.Tokenization/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-U8VVH7VJjv6czP7qWyzDq6CRaiJQe7/sESUCL8H3kiEa3zi0l9TonIKlD/YidQ5DlgTumracii6zjLyKPEFKwA==",
"path": "uglytoad.pdfpig.tokenization/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.tokenization.1.7.0-custom-5.nupkg.sha512"
},
"UglyToad.PdfPig.Tokens/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-m/j5RVfL4eF/OwX6ASprzK+yzD3l7xdgQ7zQPgENhjxfuXD+hj6FSeZlmxSTt9ywvWcTCjGKAILl9XTK9iQgCQ==",
"path": "uglytoad.pdfpig.tokens/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.tokens.1.7.0-custom-5.nupkg.sha512"
},
"xunit/2.9.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PtU3rZ0ThdmdJqTbK7GkgFf6iBaCR6Q0uvJHznID+XEYk2v6O/b7sRxqnbi3B2gRDXxjTqMkVNayzwsqsFUxRw==",
"path": "xunit/2.9.0",
"hashPath": "xunit.2.9.0.nupkg.sha512"
},
"xunit.abstractions/2.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==",
"path": "xunit.abstractions/2.0.3",
"hashPath": "xunit.abstractions.2.0.3.nupkg.sha512"
},
"xunit.assert/2.9.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Z/1pyia//860wEYTKn6Q5dmgikJdRjgE4t5AoxJkK8oTmidzPLEPG574kmm7LFkMLbH6Frwmgb750kcyR+hwoA==",
"path": "xunit.assert/2.9.0",
"hashPath": "xunit.assert.2.9.0.nupkg.sha512"
},
"xunit.core/2.9.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-uRaop9tZsZMCaUS4AfbSPGYHtvywWnm8XXFNUqII7ShWyDBgdchY6gyDNgO4AK1Lv/1NNW61Zq63CsDV6oH6Jg==",
"path": "xunit.core/2.9.0",
"hashPath": "xunit.core.2.9.0.nupkg.sha512"
},
"xunit.extensibility.core/2.9.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-zjDEUSxsr6UNij4gIwCgMqQox+oLDPRZ+mubwWLci+SssPBFQD1xeRR4SvgBuXqbE0QXCJ/STVTp+lxiB5NLVA==",
"path": "xunit.extensibility.core/2.9.0",
"hashPath": "xunit.extensibility.core.2.9.0.nupkg.sha512"
},
"xunit.extensibility.execution/2.9.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-5ZTQZvmPLlBw6QzCOwM0KnMsZw6eGjbmC176QHZlcbQoMhGIeGcYzYwn5w9yXxf+4phtplMuVqTpTbFDQh2bqQ==",
"path": "xunit.extensibility.execution/2.9.0",
"hashPath": "xunit.extensibility.execution.2.9.0.nupkg.sha512"
},
"AxCopilot/1.7.2": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"AxCopilot.SDK/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.Web.WebView2.Core/1.0.2903.40": {
"type": "reference",
"serviceable": false,
"sha512": ""
},
"Microsoft.Web.WebView2.WinForms/1.0.2903.40": {
"type": "reference",
"serviceable": false,
"sha512": ""
},
"Microsoft.Web.WebView2.Wpf/1.0.2903.40": {
"type": "reference",
"serviceable": false,
"sha512": ""
}
}
}

View File

@@ -0,0 +1,18 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "8.0.0"
}
],
"configProperties": {
"CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false
}
}
}

View File

@@ -0,0 +1,391 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0/win-x64",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {},
".NETCoreApp,Version=v8.0/win-x64": {
"AxCopilot/1.8.0": {
"dependencies": {
"AxCopilot.SDK": "1.0.0",
"DocumentFormat.OpenXml": "3.2.0",
"Markdig": "0.37.0",
"Microsoft.Data.Sqlite": "8.0.0",
"Microsoft.Web.WebView2": "1.0.2903.40",
"System.ServiceProcess.ServiceController": "8.0.1",
"UglyToad.PdfPig": "1.7.0-custom-5",
"Microsoft.Web.WebView2.Core": "1.0.2903.40",
"Microsoft.Web.WebView2.WinForms": "1.0.2903.40",
"Microsoft.Web.WebView2.Wpf": "1.0.2903.40"
},
"runtime": {
"AxCopilot.dll": {}
}
},
"DocumentFormat.OpenXml/3.2.0": {
"dependencies": {
"DocumentFormat.OpenXml.Framework": "3.2.0"
},
"runtime": {
"lib/net8.0/DocumentFormat.OpenXml.dll": {
"assemblyVersion": "3.2.0.0",
"fileVersion": "3.2.0.0"
}
}
},
"DocumentFormat.OpenXml.Framework/3.2.0": {
"dependencies": {
"System.IO.Packaging": "8.0.1"
},
"runtime": {
"lib/net8.0/DocumentFormat.OpenXml.Framework.dll": {
"assemblyVersion": "3.2.0.0",
"fileVersion": "3.2.0.0"
}
}
},
"Markdig/0.37.0": {
"runtime": {
"lib/net8.0/Markdig.dll": {
"assemblyVersion": "0.37.0.0",
"fileVersion": "0.37.0.0"
}
}
},
"Microsoft.Data.Sqlite/8.0.0": {
"dependencies": {
"Microsoft.Data.Sqlite.Core": "8.0.0",
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.6"
}
},
"Microsoft.Data.Sqlite.Core/8.0.0": {
"dependencies": {
"SQLitePCLRaw.core": "2.1.6"
},
"runtime": {
"lib/net8.0/Microsoft.Data.Sqlite.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.23.53103"
}
}
},
"Microsoft.Web.WebView2/1.0.2903.40": {
"native": {
"runtimes/win-x64/native/WebView2Loader.dll": {
"fileVersion": "1.0.2903.40"
}
}
},
"SQLitePCLRaw.bundle_e_sqlite3/2.1.6": {
"dependencies": {
"SQLitePCLRaw.lib.e_sqlite3": "2.1.6",
"SQLitePCLRaw.provider.e_sqlite3": "2.1.6"
},
"runtime": {
"lib/netstandard2.0/SQLitePCLRaw.batteries_v2.dll": {
"assemblyVersion": "2.1.6.2060",
"fileVersion": "2.1.6.2060"
}
}
},
"SQLitePCLRaw.core/2.1.6": {
"runtime": {
"lib/netstandard2.0/SQLitePCLRaw.core.dll": {
"assemblyVersion": "2.1.6.2060",
"fileVersion": "2.1.6.2060"
}
}
},
"SQLitePCLRaw.lib.e_sqlite3/2.1.6": {
"native": {
"runtimes/win-x64/native/e_sqlite3.dll": {
"fileVersion": "0.0.0.0"
}
}
},
"SQLitePCLRaw.provider.e_sqlite3/2.1.6": {
"dependencies": {
"SQLitePCLRaw.core": "2.1.6"
},
"runtime": {
"lib/net6.0-windows7.0/SQLitePCLRaw.provider.e_sqlite3.dll": {
"assemblyVersion": "2.1.6.2060",
"fileVersion": "2.1.6.2060"
}
}
},
"System.Diagnostics.EventLog/8.0.1": {
"runtime": {
"runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"System.IO.Packaging/8.0.1": {
"runtime": {
"lib/net8.0/System.IO.Packaging.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"System.ServiceProcess.ServiceController/8.0.1": {
"dependencies": {
"System.Diagnostics.EventLog": "8.0.1"
},
"runtime": {
"runtimes/win/lib/net8.0/System.ServiceProcess.ServiceController.dll": {
"assemblyVersion": "8.0.0.1",
"fileVersion": "8.0.1024.46610"
}
}
},
"UglyToad.PdfPig/1.7.0-custom-5": {
"dependencies": {
"UglyToad.PdfPig.Core": "1.7.0-custom-5",
"UglyToad.PdfPig.Fonts": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokenization": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokens": "1.7.0-custom-5"
},
"runtime": {
"lib/net6.0/UglyToad.PdfPig.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"UglyToad.PdfPig.Core/1.7.0-custom-5": {
"runtime": {
"lib/net6.0/UglyToad.PdfPig.Core.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"UglyToad.PdfPig.Fonts/1.7.0-custom-5": {
"dependencies": {
"UglyToad.PdfPig.Core": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokenization": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokens": "1.7.0-custom-5"
},
"runtime": {
"lib/net6.0/UglyToad.PdfPig.Fonts.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"UglyToad.PdfPig.Tokenization/1.7.0-custom-5": {
"dependencies": {
"UglyToad.PdfPig.Core": "1.7.0-custom-5",
"UglyToad.PdfPig.Tokens": "1.7.0-custom-5"
},
"runtime": {
"lib/net6.0/UglyToad.PdfPig.Tokenization.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"UglyToad.PdfPig.Tokens/1.7.0-custom-5": {
"dependencies": {
"UglyToad.PdfPig.Core": "1.7.0-custom-5"
},
"runtime": {
"lib/net6.0/UglyToad.PdfPig.Tokens.dll": {
"assemblyVersion": "0.1.8.0",
"fileVersion": "0.1.8.0"
}
}
},
"AxCopilot.SDK/1.0.0": {
"runtime": {
"AxCopilot.SDK.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"Microsoft.Web.WebView2.Core/1.0.2903.40": {
"runtime": {
"Microsoft.Web.WebView2.Core.dll": {
"assemblyVersion": "1.0.2903.40",
"fileVersion": "1.0.2903.40"
}
}
},
"Microsoft.Web.WebView2.WinForms/1.0.2903.40": {
"runtime": {
"Microsoft.Web.WebView2.WinForms.dll": {
"assemblyVersion": "1.0.2903.40",
"fileVersion": "1.0.2903.40"
}
}
},
"Microsoft.Web.WebView2.Wpf/1.0.2903.40": {
"runtime": {
"Microsoft.Web.WebView2.Wpf.dll": {
"assemblyVersion": "1.0.2903.40",
"fileVersion": "1.0.2903.40"
}
}
}
}
},
"libraries": {
"AxCopilot/1.8.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"DocumentFormat.OpenXml/3.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eDBT9G0sAWUvjgE8l8E5bGCFXgxCZXIecQ8dqUnj2PyxyMR5eBmLahqRRw3Q7uSKM3cKbysaL2mEY0JJbEEOEA==",
"path": "documentformat.openxml/3.2.0",
"hashPath": "documentformat.openxml.3.2.0.nupkg.sha512"
},
"DocumentFormat.OpenXml.Framework/3.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-e1neOKqRnSHUom4JQEorAoZ67aiJOp6+Xzsu0fc6IYfFcgQn6roo+w6i2w//N2u/5ilEfvLr35bNO9zaIN7r7g==",
"path": "documentformat.openxml.framework/3.2.0",
"hashPath": "documentformat.openxml.framework.3.2.0.nupkg.sha512"
},
"Markdig/0.37.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-biiu4MTPFjW55qw6v5Aphtj0MjDLJ14x8ndZwkJUHIeqvaSGKeqhLY7S7Vu/S3k7/c9KwhhnaCDP9hdFNUhcNA==",
"path": "markdig/0.37.0",
"hashPath": "markdig.0.37.0.nupkg.sha512"
},
"Microsoft.Data.Sqlite/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-H+iC5IvkCCKSNHXzL3JARvDn7VpkvuJM91KVB89sKjeTF/KX/BocNNh93ZJtX5MCQKb/z4yVKgkU2sVIq+xKfg==",
"path": "microsoft.data.sqlite/8.0.0",
"hashPath": "microsoft.data.sqlite.8.0.0.nupkg.sha512"
},
"Microsoft.Data.Sqlite.Core/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pujbzfszX7jAl7oTbHhqx7pxd9jibeyHHl8zy1gd55XMaKWjDtc5XhhNYwQnrwWYCInNdVoArbaaAvLgW7TwuA==",
"path": "microsoft.data.sqlite.core/8.0.0",
"hashPath": "microsoft.data.sqlite.core.8.0.0.nupkg.sha512"
},
"Microsoft.Web.WebView2/1.0.2903.40": {
"type": "package",
"serviceable": true,
"sha512": "sha512-THrzYAnJgE3+cNH+9Epr44XjoZoRELdVpXlWGPs6K9C9G6TqyDfVCeVAR/Er8ljLitIUX5gaSkPsy9wRhD1sgQ==",
"path": "microsoft.web.webview2/1.0.2903.40",
"hashPath": "microsoft.web.webview2.1.0.2903.40.nupkg.sha512"
},
"SQLitePCLRaw.bundle_e_sqlite3/2.1.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==",
"path": "sqlitepclraw.bundle_e_sqlite3/2.1.6",
"hashPath": "sqlitepclraw.bundle_e_sqlite3.2.1.6.nupkg.sha512"
},
"SQLitePCLRaw.core/2.1.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==",
"path": "sqlitepclraw.core/2.1.6",
"hashPath": "sqlitepclraw.core.2.1.6.nupkg.sha512"
},
"SQLitePCLRaw.lib.e_sqlite3/2.1.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==",
"path": "sqlitepclraw.lib.e_sqlite3/2.1.6",
"hashPath": "sqlitepclraw.lib.e_sqlite3.2.1.6.nupkg.sha512"
},
"SQLitePCLRaw.provider.e_sqlite3/2.1.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==",
"path": "sqlitepclraw.provider.e_sqlite3/2.1.6",
"hashPath": "sqlitepclraw.provider.e_sqlite3.2.1.6.nupkg.sha512"
},
"System.Diagnostics.EventLog/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==",
"path": "system.diagnostics.eventlog/8.0.1",
"hashPath": "system.diagnostics.eventlog.8.0.1.nupkg.sha512"
},
"System.IO.Packaging/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KYkIOAvPexQOLDxPO2g0BVoWInnQhPpkFzRqvNrNrMhVT6kqhVr0zEb6KCHlptLFukxnZrjuMVAnxK7pOGUYrw==",
"path": "system.io.packaging/8.0.1",
"hashPath": "system.io.packaging.8.0.1.nupkg.sha512"
},
"System.ServiceProcess.ServiceController/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-02I0BXo1kmMBgw03E8Hu4K6nTqur4wpQdcDZrndczPzY2fEoGvlinE35AWbyzLZ2h2IksEZ6an4tVt3hi9j1oA==",
"path": "system.serviceprocess.servicecontroller/8.0.1",
"hashPath": "system.serviceprocess.servicecontroller.8.0.1.nupkg.sha512"
},
"UglyToad.PdfPig/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-mddnoBg+XV5YZJg+lp/LlXQ9NY9/oV/MoNjLbbLHw0uTymfyuinVePQB4ff/ELRv3s6n0G7h8q3Ycb3KYg+hgQ==",
"path": "uglytoad.pdfpig/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.1.7.0-custom-5.nupkg.sha512"
},
"UglyToad.PdfPig.Core/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bChQUAYApM6/vgBis0+fBTZyAVqjXdqshjZDCgI3dgwUplfLJxXRrnkCOdNj0a6JNcF32R4aLpnGpTc9QmmVmg==",
"path": "uglytoad.pdfpig.core/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.core.1.7.0-custom-5.nupkg.sha512"
},
"UglyToad.PdfPig.Fonts/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Z6SBBAIL8wRkJNhXGYaz0CrHnNrNeuNtmwRbBtQUA1b3TDhRQppOmHCIuhjb6Vu/Rirp6FIOtzAU1lXsGik90w==",
"path": "uglytoad.pdfpig.fonts/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.fonts.1.7.0-custom-5.nupkg.sha512"
},
"UglyToad.PdfPig.Tokenization/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-U8VVH7VJjv6czP7qWyzDq6CRaiJQe7/sESUCL8H3kiEa3zi0l9TonIKlD/YidQ5DlgTumracii6zjLyKPEFKwA==",
"path": "uglytoad.pdfpig.tokenization/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.tokenization.1.7.0-custom-5.nupkg.sha512"
},
"UglyToad.PdfPig.Tokens/1.7.0-custom-5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-m/j5RVfL4eF/OwX6ASprzK+yzD3l7xdgQ7zQPgENhjxfuXD+hj6FSeZlmxSTt9ywvWcTCjGKAILl9XTK9iQgCQ==",
"path": "uglytoad.pdfpig.tokens/1.7.0-custom-5",
"hashPath": "uglytoad.pdfpig.tokens.1.7.0-custom-5.nupkg.sha512"
},
"AxCopilot.SDK/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.Web.WebView2.Core/1.0.2903.40": {
"type": "reference",
"serviceable": false,
"sha512": ""
},
"Microsoft.Web.WebView2.WinForms/1.0.2903.40": {
"type": "reference",
"serviceable": false,
"sha512": ""
},
"Microsoft.Web.WebView2.Wpf/1.0.2903.40": {
"type": "reference",
"serviceable": false,
"sha512": ""
}
}
}

Some files were not shown because too many files have changed in this diff Show More